yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
piano_roll_view.h
Go to the documentation of this file.
1#ifndef YAZE_EDITOR_MUSIC_PIANO_ROLL_VIEW_H
2#define YAZE_EDITOR_MUSIC_PIANO_ROLL_VIEW_H
3
4#include <functional>
5
6#include "imgui/imgui.h"
10
11namespace yaze {
12namespace editor {
13namespace music {
14
16 ImU32 white_key;
17 ImU32 black_key;
20 ImU32 note;
24 ImU32 key_label;
27};
28
33 public:
34 PianoRollView() = default;
35 ~PianoRollView() = default;
36
42 void Draw(zelda3::music::MusicSong* song, const zelda3::music::MusicBank* bank = nullptr);
43
47 void SetOnEditCallback(std::function<void()> callback) { on_edit_ = callback; }
48
53 std::function<void(const zelda3::music::TrackEvent&, int, int)> callback) {
54 on_note_preview_ = callback;
55 }
56
61 std::function<void(const zelda3::music::MusicSong&, int)> callback) {
62 on_segment_preview_ = callback;
63 }
64
66 void SetActiveChannel(int channel) { active_channel_index_ = channel; }
67
69 void SetActiveSegment(int segment) { active_segment_index_ = segment; }
70
71 // Get the selected instrument for preview/insertion
73
74 // Playback cursor support
75 void SetPlaybackState(bool is_playing, bool is_paused, uint32_t current_tick) {
76 is_playing_ = is_playing;
77 is_paused_ = is_paused;
78 playback_tick_ = current_tick;
79 }
80
81 void SetFollowPlayback(bool follow) { follow_playback_ = follow; }
82 bool IsFollowingPlayback() const { return follow_playback_; }
83 bool IsPlaying() const { return is_playing_; }
84 bool IsPaused() const { return is_paused_; }
85
86 private:
87 // UI Helper methods
91 void DrawRollCanvas(zelda3::music::MusicSong* song, const RollPalette& palette,
92 const ImVec2& canvas_size);
93
94 // Drawing Helpers
95 void DrawPianoKeys(ImDrawList* draw_list, const ImVec2& key_origin, float total_height,
96 int start_key_idx, int visible_keys, const RollPalette& palette);
97 void DrawGrid(ImDrawList* draw_list, const ImVec2& grid_origin, const ImVec2& canvas_pos,
98 const ImVec2& canvas_size, float total_height, float clip_bottom,
99 int start_tick, int visible_ticks, int start_key_idx, int visible_keys,
100 float content_width, const RollPalette& palette);
101 void DrawNotes(ImDrawList* draw_list, const zelda3::music::MusicSong* song,
102 const ImVec2& grid_origin, float total_height,
103 int start_tick, int end_tick, int start_key_idx, int visible_keys,
104 const RollPalette& palette);
105 void DrawPlaybackCursor(ImDrawList* draw_list, const ImVec2& grid_origin,
106 float grid_height, uint32_t segment_start_tick);
107
108 // Input Handling
109 void HandleMouseInput(zelda3::music::MusicSong* song, int active_channel, int active_segment,
110 const ImVec2& grid_origin, const ImVec2& grid_size, bool is_hovered);
111
112 // Layout constants
113 static constexpr float kToolbarHeight = 32.0f;
114 static constexpr float kStatusBarHeight = 24.0f;
115 static constexpr float kChannelListWidth = 140.0f;
116
117 // State
120 int preview_instrument_index_ = 0; // Selected instrument for new notes
121 float pixels_per_tick_ = 2.0f;
122 float key_height_ = 12.0f;
123 float key_width_ = 40.0f;
124 float scroll_x_px_ = 0.0f;
125 float scroll_y_px_ = 0.0f; // Scroll offsets in pixels
126 bool snap_enabled_ = true;
128 bool follow_playback_ = false;
129
130 // Channel State
131 std::vector<bool> channel_visible_ = std::vector<bool>(8, true);
132 std::vector<bool> channel_muted_ = std::vector<bool>(8, false);
133 std::vector<bool> channel_solo_ = std::vector<bool>(8, false);
134 std::vector<ImU32> channel_colors_;
135
136 // Editing State
137 int drag_mode_ = 0; // 0=None, 1=Move, 2=ResizeLeft, 3=ResizeRight
144
145 // Status bar state (mouse position in grid coordinates)
146 int status_tick_ = -1;
148 std::string status_note_name_;
149
150 // Drag state for HandleMouseInput
154 bool drag_moved_ = false;
157
158 // Context Menu State
164
166 int segment = -1;
167 int channel = -1;
168 int tick = -1;
169 uint8_t pitch = 0;
171
172 // Callbacks
173 std::function<void()> on_edit_;
174 std::function<void(const zelda3::music::TrackEvent&, int segment_index, int channel_index)>
176 std::function<void(const zelda3::music::MusicSong&, int segment_index)> on_segment_preview_;
177
178 // Playback state
179 bool is_playing_ = false;
180 bool is_paused_ = false;
181 uint32_t playback_tick_ = 0;
182};
183
184} // namespace music
185} // namespace editor
186} // namespace yaze
187
188#endif // YAZE_EDITOR_MUSIC_PIANO_ROLL_VIEW_H
UI component for displaying and editing music tracks as a piano roll.
void DrawPianoKeys(ImDrawList *draw_list, const ImVec2 &key_origin, float total_height, int start_key_idx, int visible_keys, const RollPalette &palette)
struct yaze::editor::music::PianoRollView::EmptyContextTarget empty_context_
void DrawRollCanvas(zelda3::music::MusicSong *song, const RollPalette &palette, const ImVec2 &canvas_size)
void DrawChannelList(const zelda3::music::MusicSong *song)
void DrawStatusBar(const zelda3::music::MusicSong *song)
struct yaze::editor::music::PianoRollView::ContextTarget context_target_
static constexpr float kStatusBarHeight
std::function< void(const zelda3::music::TrackEvent &, int segment_index, int channel_index) on_note_preview_)
void DrawNotes(ImDrawList *draw_list, const zelda3::music::MusicSong *song, const ImVec2 &grid_origin, float total_height, int start_tick, int end_tick, int start_key_idx, int visible_keys, const RollPalette &palette)
void SetPlaybackState(bool is_playing, bool is_paused, uint32_t current_tick)
void Draw(zelda3::music::MusicSong *song, const zelda3::music::MusicBank *bank=nullptr)
Draw the piano roll view for the given song.
static constexpr float kChannelListWidth
void DrawPlaybackCursor(ImDrawList *draw_list, const ImVec2 &grid_origin, float grid_height, uint32_t segment_start_tick)
void SetOnNotePreview(std::function< void(const zelda3::music::TrackEvent &, int, int)> callback)
Set callback for note preview.
static constexpr float kToolbarHeight
void DrawGrid(ImDrawList *draw_list, const ImVec2 &grid_origin, const ImVec2 &canvas_pos, const ImVec2 &canvas_size, float total_height, float clip_bottom, int start_tick, int visible_ticks, int start_key_idx, int visible_keys, float content_width, const RollPalette &palette)
void HandleMouseInput(zelda3::music::MusicSong *song, int active_channel, int active_segment, const ImVec2 &grid_origin, const ImVec2 &grid_size, bool is_hovered)
void DrawToolbar(const zelda3::music::MusicSong *song, const zelda3::music::MusicBank *bank)
zelda3::music::TrackEvent drag_original_event_
void SetOnEditCallback(std::function< void()> callback)
Set callback for when edits occur.
void SetOnSegmentPreview(std::function< void(const zelda3::music::MusicSong &, int)> callback)
Set callback for segment preview.
std::function< void(const zelda3::music::MusicSong &, int segment_index) on_segment_preview_)
Manages the collection of songs, instruments, and samples from a ROM.
Definition music_bank.h:27
constexpr uint8_t kDurationSixteenth
Definition song_data.h:68
A complete song composed of segments.
Definition song_data.h:334
A single event in a music track (note, command, or control).
Definition song_data.h:247