summaryrefslogtreecommitdiff
path: root/Applications/Piano/KeysWidget.h
diff options
context:
space:
mode:
authorWilliam McPherson <willmcpherson2@gmail.com>2020-01-31 03:02:45 +1100
committerAndreas Kling <kling@serenityos.org>2020-01-31 13:13:04 +0100
commit4a36a5161833f28f045f30fe30c64f3100cce2e1 (patch)
tree149c4877b96f465f9790393d71fb6e4c05e7294e /Applications/Piano/KeysWidget.h
parentddefb95b2114aea0ec92e547ca03f8a3373d9fd0 (diff)
downloadserenity-4a36a5161833f28f045f30fe30c64f3100cce2e1.zip
Piano: Rewrite application
Goals: - Switch to a more typical LibGUI arrangement - Separate GUI (MainWidget) and audio (AudioEngine) - Improve on existing features while retaining the same feature set Improvements: - Each GUI element is a separate widget - The wave (WaveWidget) scales with the window - The piano roll (RollWidget) scales horizontally and scrolls vertically - The piano (KeysWidget) fits as many notes as possible - The knobs (KnobsWidget) are now sliders - All mouse and key events are handled in constant time - The octave can be changed while playing notes - The same note can be played with the mouse, keyboard and roll at the same time, and the volume of the resulting note is scaled accordingly - Note frequency constants use the maximum precision available in a double
Diffstat (limited to 'Applications/Piano/KeysWidget.h')
-rw-r--r--Applications/Piano/KeysWidget.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/Applications/Piano/KeysWidget.h b/Applications/Piano/KeysWidget.h
new file mode 100644
index 0000000000..c8cdb315ae
--- /dev/null
+++ b/Applications/Piano/KeysWidget.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2019-2020, William McPherson <willmcpherson2@gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "Music.h"
+#include <LibGUI/GFrame.h>
+
+class AudioEngine;
+
+class KeysWidget final : public GFrame {
+ C_OBJECT(KeysWidget)
+public:
+ virtual ~KeysWidget() override;
+
+ int key_code_to_key(int key_code) const;
+ int mouse_note() const;
+
+ void set_key(int key, Switch);
+
+private:
+ KeysWidget(GWidget* parent, AudioEngine&);
+
+ virtual void paint_event(GPaintEvent&) override;
+ virtual void mousedown_event(GMouseEvent&) override;
+ virtual void mouseup_event(GMouseEvent&) override;
+ virtual void mousemove_event(GMouseEvent&) override;
+
+ int note_for_event_position(Point) const;
+
+ AudioEngine& m_audio_engine;
+
+ u8 m_key_on[note_count] { 0 };
+
+ bool m_mouse_down { false };
+ int m_mouse_note { -1 };
+};