Skip to content

Commit 1822e0e

Browse files
committed
feat(zq): added buttons to the dmap editor to preview enhanced music looping
1 parent 33be443 commit 1822e0e

File tree

14 files changed

+340
-191
lines changed

14 files changed

+340
-191
lines changed

modules/zelda/ZeldaCore.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ src/slopes.cpp
2828
src/zc/saves.cpp
2929
src/zc/db_rng.cpp
3030
src/zc/zc_ffc.cpp
31+
src/music_playback.cpp
3132

3233
## End of Zelda Core module
3334
)

modules/zquest/ZQuestCore.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ src/zinfo.cpp
2020
src/zconfig.cpp
2121
src/ffc.cpp
2222
src/slopes.cpp
23+
src/music_playback.cpp
2324

2425
## End of ZQuest Core module
2526
)

src/dialog/edit_dmap.cpp

Lines changed: 142 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
#include "zq/zquest.h"
55
#include "zq/zq_class.h"
66
#include "zc_list_data.h"
7+
#include "zc/zc_sys.h"
8+
#include "play_midi.h"
79
#include "info.h"
810
#include "subscr.h"
911
#include <fmt/format.h>
1012
#include <base/qrs.h>
13+
#include "music_playback.h"
1114

1215
static size_t editdmap_tab = 0;
1316
static int32_t dmap_use_script_data = 2;
17+
extern int32_t midi_volume;
1418
extern script_data* dmapscripts[NUMSCRIPTSDMAP];
1519
#define DSCRDATA_NONE 0x00
1620
#define DSCRDATA_ACTIVE 0x01
@@ -63,11 +67,22 @@ EditDMapDialog::EditDMapDialog(int32_t slot) :
6367
}
6468
}
6569

66-
// trims spaces at the end of a string
67-
bool EditDMapDialog::disableEnhancedMusic()
70+
bool EditDMapDialog::disableEnhancedMusic(bool disableontracker)
6871
{
6972
if (local_dmap.tmusic[0] == 0)
7073
return true;
74+
75+
ZCMUSIC* tempdmapzcmusic = zcmusic_load_for_quest(local_dmap.tmusic, filepath);
76+
bool isTracker = true;
77+
78+
if (tempdmapzcmusic != NULL)
79+
{
80+
if (disableontracker && !(tempdmapzcmusic->type == ZCMF_MP3 || tempdmapzcmusic->type == ZCMF_OGG))
81+
return true;
82+
}
83+
else
84+
return true;
85+
7186
return false;
7287
}
7388

@@ -78,6 +93,47 @@ bool EditDMapDialog::disableMusicTracks()
7893
return disableEnhancedMusic();
7994
}
8095

96+
void EditDMapDialog::silenceMusicPreview()
97+
{
98+
zc_stop_midi();
99+
100+
if (zcmusic != NULL)
101+
{
102+
zcmusic_stop(zcmusic);
103+
zcmusic_unload_file(zcmusic);
104+
zcmusic = NULL;
105+
zcmixer->newtrack = NULL;
106+
}
107+
}
108+
109+
void EditDMapDialog::musicPreview(bool previewloop)
110+
{
111+
silenceMusicPreview();
112+
113+
if (local_dmap.tmusic[0] == 0)
114+
{
115+
if (local_dmap.midi > 3)
116+
zc_play_midi((MIDI*)customtunes[local_dmap.midi-4].data, true);
117+
}
118+
else
119+
{
120+
if(local_dmap.tmusic[0])
121+
{
122+
if(play_enh_music_crossfade(local_dmap.tmusic, filepath, local_dmap.tmusictrack, midi_volume, (previewloop || musicpreview_saved) ? 0 : local_dmap.tmusic_xfade_in, local_dmap.tmusic_xfade_out))
123+
{
124+
if (previewloop)
125+
{
126+
int32_t startpos = zc_max(local_dmap.tmusic_loop_end - 10000, 0);
127+
zcmusic_set_curpos(zcmusic, startpos);
128+
}
129+
if (musicpreview_saved)
130+
zcmusic_set_curpos(zcmusic, musicpreview_saved);
131+
zcmusic_set_loop(zcmusic, double(local_dmap.tmusic_loop_start / 10000.0), double(local_dmap.tmusic_loop_end / 10000.0));
132+
}
133+
}
134+
}
135+
}
136+
81137
bool sm_dmap(int dmaptype)
82138
{
83139
switch (dmaptype & dmfTYPE)
@@ -192,6 +248,20 @@ std::shared_ptr<GUI::Widget> EditDMapDialog::view()
192248
window = Window(
193249
title = titlebuf,
194250
onClose = message::CANCEL,
251+
use_vsync = true,
252+
onTick = [&]()
253+
{
254+
zcmixer_update(zcmixer, midi_volume, 1000000, false);
255+
if (zcmusic)
256+
{
257+
int32_t pos = zcmusic_get_curpos(zcmusic);
258+
if (pos > 0)
259+
tmusic_progress_lbl->setText(fmt::format("{:.4f}s", pos / 10000.0));
260+
else
261+
tmusic_progress_lbl->setText("");
262+
}
263+
return ONTICK_CONTINUE;
264+
},
195265
Column(
196266
Row(hAlign = 0.0,
197267
Label(text = "Name:", hAlign = 0.0, colSpan = 2),
@@ -213,6 +283,7 @@ std::shared_ptr<GUI::Widget> EditDMapDialog::view()
213283
ptr = &editdmap_tab,
214284
onSwitch = [&](size_t, size_t)
215285
{
286+
silenceMusicPreview();
216287
refreshGridSquares();
217288
},
218289
TabRef(name = "Mechanics", Column(
@@ -498,7 +569,7 @@ std::shared_ptr<GUI::Widget> EditDMapDialog::view()
498569
tmusic_start_field = TextField(
499570
fitParent = true, hAlign = 0.0,
500571
type = GUI::TextField::type::FIXED_DECIMAL,
501-
disabled = disableEnhancedMusic(),
572+
disabled = disableEnhancedMusic(true),
502573
low = 0, high = 2147479999,
503574
val = local_dmap.tmusic_loop_start,
504575
onValChangedFunc = [&](GUI::TextField::type, std::string_view, int32_t val)
@@ -509,7 +580,7 @@ std::shared_ptr<GUI::Widget> EditDMapDialog::view()
509580
tmusic_end_field = TextField(
510581
fitParent = true, hAlign = 0.0,
511582
type = GUI::TextField::type::FIXED_DECIMAL,
512-
disabled = disableEnhancedMusic(),
583+
disabled = disableEnhancedMusic(true),
513584
val = local_dmap.tmusic_loop_end,
514585
low = 0, high = 2147479999,
515586
onValChangedFunc = [&](GUI::TextField::type, std::string_view, int32_t val)
@@ -542,10 +613,57 @@ std::shared_ptr<GUI::Widget> EditDMapDialog::view()
542613
})
543614
)
544615
),
616+
tmusic_progress_lbl = Label(text = "", hAlign = 0.0),
617+
Rows<3>(
618+
tmusic_preview_btn = Button(text = "Preview",
619+
maxheight = 24_px,
620+
disabled = disableEnhancedMusic(),
621+
onPressFunc = [&]()
622+
{
623+
musicpreview_saved = 0;
624+
musicPreview();
625+
}),
626+
tmusic_previewloop_btn = Button(text = "Preview Loop",
627+
maxheight = 24_px,
628+
disabled = disableEnhancedMusic(true),
629+
onPressFunc = [&]()
630+
{
631+
musicpreview_saved = 0;
632+
musicPreview(true);
633+
}),
634+
tmusic_previewstop_btn = Button(text = "Pause",
635+
maxheight = 24_px,
636+
disabled = disableEnhancedMusic(true),
637+
onPressFunc = [&]()
638+
{
639+
if(musicpreview_saved)
640+
{
641+
musicPreview();
642+
musicpreview_saved = 0;
643+
}
644+
else
645+
{
646+
if (zcmusic)
647+
musicpreview_saved = zcmusic_get_curpos(zcmusic);
648+
silenceMusicPreview();
649+
}
650+
})
651+
),
545652
Rows<2>(
546653
Button(text = "Load",
654+
maxheight = 24_px,
547655
onPressFunc = [&]()
548656
{
657+
zc_stop_midi();
658+
659+
if (zcmusic != NULL)
660+
{
661+
zcmusic_stop(zcmusic);
662+
zcmusic_unload_file(zcmusic);
663+
zcmusic = NULL;
664+
zcmixer->newtrack = NULL;
665+
}
666+
549667
if (getname("Load DMap Music", (char*)zcmusic_types, NULL, tmusicpath, false))
550668
{
551669
strcpy(tmusicpath, temppath);
@@ -578,23 +696,40 @@ std::shared_ptr<GUI::Widget> EditDMapDialog::view()
578696

579697
tmusic_field->setText(local_dmap.tmusic);
580698
tmusic_track_list->setDisabled(disableMusicTracks());
581-
tmusic_start_field->setDisabled(disableEnhancedMusic());
582-
tmusic_end_field->setDisabled(disableEnhancedMusic());
699+
tmusic_start_field->setDisabled(disableEnhancedMusic(true));
700+
tmusic_end_field->setDisabled(disableEnhancedMusic(true));
583701
tmusic_xfadein_field->setDisabled(disableEnhancedMusic());
584702
tmusic_xfadeout_field->setDisabled(disableEnhancedMusic());
703+
tmusic_preview_btn->setDisabled(disableEnhancedMusic());
704+
tmusic_previewloop_btn->setDisabled(disableEnhancedMusic(true));
705+
tmusic_previewstop_btn->setDisabled(disableEnhancedMusic(true));
585706
}
586707
}
587708
}),
588709
Button(text = "Clear",
710+
maxheight = 24_px,
589711
onPressFunc = [&]()
590712
{
713+
zc_stop_midi();
714+
715+
if (zcmusic != NULL)
716+
{
717+
zcmusic_stop(zcmusic);
718+
zcmusic_unload_file(zcmusic);
719+
zcmusic = NULL;
720+
zcmixer->newtrack = NULL;
721+
}
722+
591723
memset(local_dmap.tmusic, 0, 56);
592724
tmusic_field->setText("");
593725
tmusic_track_list->setDisabled(true);
594726
tmusic_start_field->setDisabled(true);
595727
tmusic_end_field->setDisabled(true);
596728
tmusic_xfadein_field->setDisabled(true);
597729
tmusic_xfadeout_field->setDisabled(true);
730+
tmusic_preview_btn->setDisabled(true);
731+
tmusic_previewloop_btn->setDisabled(true);
732+
tmusic_previewstop_btn->setDisabled(true);
598733
})
599734
)
600735
)
@@ -986,6 +1121,7 @@ bool EditDMapDialog::handleMessage(const GUI::DialogMessage<message>& msg)
9861121
[[fallthrough]];
9871122
case message::CANCEL:
9881123
default:
1124+
silenceMusicPreview();
9891125
return true;
9901126
}
9911127
return false;

src/dialog/edit_dmap.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ class EditDMapDialog : public GUI::Dialog<EditDMapDialog>
3131

3232
EditDMapDialog(int32_t slot);
3333

34-
bool disableEnhancedMusic();
34+
bool disableEnhancedMusic(bool disableontracker = false);
3535
bool disableMusicTracks();
36+
void silenceMusicPreview();
37+
void musicPreview(bool previewloop = false);
3638
std::shared_ptr<GUI::Widget> view() override;
3739
bool handleMessage(const GUI::DialogMessage<message>& msg);
3840

@@ -53,6 +55,10 @@ class EditDMapDialog : public GUI::Dialog<EditDMapDialog>
5355
std::shared_ptr<GUI::TextField> tmusic_end_field;
5456
std::shared_ptr<GUI::TextField> tmusic_xfadein_field;
5557
std::shared_ptr<GUI::TextField> tmusic_xfadeout_field;
58+
std::shared_ptr<GUI::Label> tmusic_progress_lbl;
59+
std::shared_ptr<GUI::Button> tmusic_preview_btn;
60+
std::shared_ptr<GUI::Button> tmusic_previewloop_btn;
61+
std::shared_ptr<GUI::Button> tmusic_previewstop_btn;
5662
std::shared_ptr<GUI::List> disabled_list;
5763
std::shared_ptr<GUI::List> item_list;
5864
std::shared_ptr<GUI::Widget> DMAP_AC_INITD(int index);
@@ -75,6 +81,8 @@ class EditDMapDialog : public GUI::Dialog<EditDMapDialog>
7581

7682
std::shared_ptr<GUI::Switcher> string_switch;
7783

84+
int32_t musicpreview_saved = 0;
85+
7886
int32_t dmapslot;
7987
dmap* thedmap;
8088
dmap local_dmap;

0 commit comments

Comments
 (0)