From b719d8cf963daf0eb35d1e196f4573970d0bb3a6 Mon Sep 17 00:00:00 2001 From: Carl Philipp Klemm Date: Thu, 5 Mar 2026 23:46:29 +0100 Subject: [PATCH] Add icons refactor repo structure --- CMakeLists.txt | 36 +- README.md | 78 +-- moc_predefs.h | 473 ------------------ res/xyz.uvos.aceradio.png | Bin 0 -> 3880 bytes res/xyz.uvos.aceradio.svg | 65 +++ AceStepWorker.cpp => src/AceStepWorker.cpp | 3 +- AceStepWorker.h => src/AceStepWorker.h | 0 .../AdvancedSettingsDialog.cpp | 0 .../AdvancedSettingsDialog.h | 0 .../AdvancedSettingsDialog.ui | 0 AudioPlayer.cpp => src/AudioPlayer.cpp | 0 AudioPlayer.h => src/AudioPlayer.h | 0 MainWindow.cpp => src/MainWindow.cpp | 94 ++-- MainWindow.h => src/MainWindow.h | 4 +- MainWindow.ui => src/MainWindow.ui | 55 +- SongDialog.cpp => src/SongDialog.cpp | 0 SongDialog.h => src/SongDialog.h | 0 SongDialog.ui => src/SongDialog.ui | 0 SongItem.h => src/SongItem.h | 5 +- SongListModel.cpp => src/SongListModel.cpp | 12 + SongListModel.h => src/SongListModel.h | 4 +- src/clickableslider.cpp | 60 +++ src/clickableslider.h | 22 + main.cpp => src/main.cpp | 0 24 files changed, 317 insertions(+), 594 deletions(-) delete mode 100644 moc_predefs.h create mode 100644 res/xyz.uvos.aceradio.png create mode 100644 res/xyz.uvos.aceradio.svg rename AceStepWorker.cpp => src/AceStepWorker.cpp (98%) rename AceStepWorker.h => src/AceStepWorker.h (100%) rename AdvancedSettingsDialog.cpp => src/AdvancedSettingsDialog.cpp (100%) rename AdvancedSettingsDialog.h => src/AdvancedSettingsDialog.h (100%) rename AdvancedSettingsDialog.ui => src/AdvancedSettingsDialog.ui (100%) rename AudioPlayer.cpp => src/AudioPlayer.cpp (100%) rename AudioPlayer.h => src/AudioPlayer.h (100%) rename MainWindow.cpp => src/MainWindow.cpp (90%) rename MainWindow.h => src/MainWindow.h (95%) rename MainWindow.ui => src/MainWindow.ui (84%) rename SongDialog.cpp => src/SongDialog.cpp (100%) rename SongDialog.h => src/SongDialog.h (100%) rename SongDialog.ui => src/SongDialog.ui (100%) rename SongItem.h => src/SongItem.h (71%) rename SongListModel.cpp => src/SongListModel.cpp (96%) rename SongListModel.h => src/SongListModel.h (96%) create mode 100644 src/clickableslider.cpp create mode 100644 src/clickableslider.h rename main.cpp => src/main.cpp (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 99f4bce..260f269 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,23 +14,25 @@ set(CMAKE_AUTOUIC ON) # Add executable add_executable(${PROJECT_NAME} - main.cpp - MainWindow.ui - MainWindow.cpp - MainWindow.h - AdvancedSettingsDialog.ui - AdvancedSettingsDialog.cpp - AdvancedSettingsDialog.h - SongDialog.ui - SongDialog.cpp - SongDialog.h - SongListModel.cpp - SongListModel.h - AudioPlayer.cpp - AudioPlayer.h - AceStepWorker.cpp - AceStepWorker.h - SongItem.h + src/main.cpp + src/MainWindow.ui + src/MainWindow.cpp + src/MainWindow.h + src/AdvancedSettingsDialog.ui + src/AdvancedSettingsDialog.cpp + src/AdvancedSettingsDialog.h + src/SongDialog.ui + src/SongDialog.cpp + src/SongDialog.h + src/SongListModel.cpp + src/SongListModel.h + src/AudioPlayer.cpp + src/AudioPlayer.h + src/AceStepWorker.cpp + src/AceStepWorker.h + src/SongItem.h + src/clickableslider.h + src/clickableslider.cpp ${MusicGeneratorGUI_H} ) diff --git a/README.md b/README.md index b10aa6f..3a5f9a4 100644 --- a/README.md +++ b/README.md @@ -1,88 +1,36 @@ -# Music Generator GUI +# Aceradio -A Qt-based graphical user interface for generating music using acestep.cpp. - -## Features - -- **Song List Management**: Add, edit, and remove songs with captions and optional lyrics -- **Playback Controls**: Play, skip, and shuffle functionality -- **Settings Tab**: Customize the JSON template for AceStep generation parameters -- **Progress Tracking**: Visual progress bar during music generation -- **Seamless Playback**: Automatically generates and plays the next song when current one finishes +A C++ Qt graphical user interface for generating music using acestep.cpp. ## Requirements -- Qt 5 or Qt 6 (with Core, Gui, Widgets, and Multimedia modules) +- Qt 6 Core, Gui, Widgets, and Multimedia - CMake 3.14+ -- acestep.cpp properly built with models downloaded +- acestep.cpp (bring your own binaries) ## Building ### Build acestep.cpp first: ```bash +git clone https://github.com/ServeurpersoCom/acestep.cpp.git cd acestep.cpp -git submodule update --init mkdir build && cd build -cmake .. -DGGML_BLAS=ON # or other backend options -cmake --build . --config Release -j$(nproc) +cmake .. -DGGML_VULKAN=ON # or other backend +make -j$(nproc) ./models.sh # Download models (requires ~7.7 GB free space) ``` -### Build the GUI application: +### Build the GUI: ```bash -cd .. +git clone git@github.com:IMbackK/aceradio.git +cd aceradio mkdir build && cd build cmake .. -cmake --build . --config Release -j$(nproc) +make -j$(nproc) ``` -## Usage +### Build the GUI: -1. **Add Songs**: Click "Add Song" to create new song entries with captions and optional lyrics -2. **Edit Songs**: Select a song and click "Edit Song" to modify it -3. **Remove Songs**: Select a song and click "Remove Song" to delete it -4. **Play Music**: Click "Play" to start generating and playing music from the selected song or first song in the list -5. **Skip Songs**: Click "Skip" to move to the next song immediately -6. **Shuffle Mode**: Toggle "Shuffle" to play songs in random order -7. **Settings**: Click "Settings" in the menu bar to edit the JSON template for generation parameters - -## Settings (JSON Template) - -The JSON template allows you to customize AceStep generation parameters: - -```json -{ - "inference_steps": 8, - "shift": 3.0, - "vocal_language": "en", - "lm_temperature": 0.85, - "lm_cfg_scale": 2.0, - "lm_top_p": 0.9 -} -``` - -Available fields: -- `caption` (required, will be overridden by song entry) -- `lyrics` (optional, can be empty to let LLM generate) -- `instrumental` (boolean) -- `bpm` (integer) -- `duration` (float in seconds) -- `keyscale` (string like "C major") -- `timesignature` (string like "4/4") -- `vocal_language` (string like "en", "fr", etc.) -- `seed` (integer for reproducibility) -- `lm_temperature`, `lm_cfg_scale`, `lm_top_p`, `lm_top_k` (LM generation parameters) -- `lm_negative_prompt` (string) -- `audio_codes` (string, for advanced users) -- `inference_steps` (integer) -- `guidance_scale` (float) -- `shift` (float) - -## Notes - -- The first time you generate a song, it may take several minutes as the models load into memory -- Generated WAV files are created in your system's temporary directory and played immediately -- Shuffle mode uses simple random selection without replacement within a playback session -- Skip button works even during generation - it will wait for current generation to finish then play next song +Go to settings->Ace Step->Model Paths and add the paths to the acestep.cpp binaries the models. diff --git a/moc_predefs.h b/moc_predefs.h deleted file mode 100644 index 165c2ba..0000000 --- a/moc_predefs.h +++ /dev/null @@ -1,473 +0,0 @@ -#define __DBL_MIN_EXP__ (-1021) -#define __LDBL_MANT_DIG__ 64 -#define __cpp_nontype_template_parameter_auto 201606L -#define __UINT_LEAST16_MAX__ 0xffff -#define __FLT16_HAS_QUIET_NAN__ 1 -#define __ATOMIC_ACQUIRE 2 -#define __FLT128_MAX_10_EXP__ 4932 -#define __FLT_MIN__ 1.17549435082228750796873653722224568e-38F -#define __GCC_IEC_559_COMPLEX 2 -#define __cpp_aggregate_nsdmi 201304L -#define __UINT_LEAST8_TYPE__ unsigned char -#define __SIZEOF_FLOAT80__ 16 -#define __BFLT16_DENORM_MIN__ 9.18354961579912115600575419704879436e-41BF16 -#define __INTMAX_C(c) c ## L -#define __CHAR_BIT__ 8 -#define __UINT8_MAX__ 0xff -#define __SCHAR_WIDTH__ 8 -#define __WINT_MAX__ 0xffffffffU -#define __FLT32_MIN_EXP__ (-125) -#define __cpp_static_assert 201411L -#define __BFLT16_MIN_10_EXP__ (-37) -#define __cpp_inheriting_constructors 201511L -#define __ORDER_LITTLE_ENDIAN__ 1234 -#define __WCHAR_MAX__ 0x7fffffff -#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 -#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 -#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1 -#define __GCC_ATOMIC_CHAR_LOCK_FREE 2 -#define __GCC_IEC_559 2 -#define __FLT32X_DECIMAL_DIG__ 17 -#define __FLT_EVAL_METHOD__ 0 -#define __cpp_binary_literals 201304L -#define __FLT64_DECIMAL_DIG__ 17 -#define __cpp_noexcept_function_type 201510L -#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2 -#define __cpp_variadic_templates 200704L -#define __UINT_FAST64_MAX__ 0xffffffffffffffffUL -#define __SIG_ATOMIC_TYPE__ int -#define __DBL_MIN_10_EXP__ (-307) -#define __FINITE_MATH_ONLY__ 0 -#define __cpp_variable_templates 201304L -#define __FLT32X_MAX_EXP__ 1024 -#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 -#define __FLT32_HAS_DENORM__ 1 -#define __UINT_FAST8_MAX__ 0xff -#define __cpp_rvalue_reference 200610L -#define __cpp_nested_namespace_definitions 201411L -#define __DEC64_MAX_EXP__ 385 -#define __INT8_C(c) c -#define __LDBL_HAS_INFINITY__ 1 -#define __INT_LEAST8_WIDTH__ 8 -#define __cpp_variadic_using 201611L -#define __UINT_LEAST64_MAX__ 0xffffffffffffffffUL -#define __INT_LEAST8_MAX__ 0x7f -#define __cpp_attributes 200809L -#define __cpp_capture_star_this 201603L -#define __SHRT_MAX__ 0x7fff -#define __LDBL_MAX__ 1.18973149535723176502126385303097021e+4932L -#define __FLT64X_MAX_10_EXP__ 4932 -#define __cpp_if_constexpr 201606L -#define __BFLT16_MAX_10_EXP__ 38 -#define __BFLT16_MAX_EXP__ 128 -#define __LDBL_IS_IEC_60559__ 1 -#define __FLT64X_HAS_QUIET_NAN__ 1 -#define __UINT_LEAST8_MAX__ 0xff -#define __GCC_ATOMIC_BOOL_LOCK_FREE 2 -#define __FLT128_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966F128 -#define __UINTMAX_TYPE__ long unsigned int -#define __cpp_nsdmi 200809L -#define __BFLT16_DECIMAL_DIG__ 4 -#define __linux 1 -#define __DEC32_EPSILON__ 1E-6DF -#define __FLT_EVAL_METHOD_TS_18661_3__ 0 -#define __OPTIMIZE__ 1 -#define __UINT32_MAX__ 0xffffffffU -#define __GXX_EXPERIMENTAL_CXX0X__ 1 -#define __DBL_DENORM_MIN__ double(4.94065645841246544176568792868221372e-324L) -#define __FLT128_MIN_EXP__ (-16381) -#define __DEC64X_MAX_EXP__ 6145 -#define __WINT_MIN__ 0U -#define __FLT128_MIN_10_EXP__ (-4931) -#define __FLT32X_IS_IEC_60559__ 1 -#define __INT_LEAST16_WIDTH__ 16 -#define __SCHAR_MAX__ 0x7f -#define __FLT128_MANT_DIG__ 113 -#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) -#define __INT64_C(c) c ## L -#define __SSP_STRONG__ 3 -#define __GCC_ATOMIC_POINTER_LOCK_FREE 2 -#define __ATOMIC_SEQ_CST 5 -#define __unix 1 -#define __INT_LEAST64_MAX__ 0x7fffffffffffffffL -#define __FLT32X_MANT_DIG__ 53 -#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2 -#define __cpp_aligned_new 201606L -#define __FLT32_MAX_10_EXP__ 38 -#define __FLT64X_EPSILON__ 1.08420217248550443400745280086994171e-19F64x -#define __STDC_HOSTED__ 1 -#define __DEC64_MIN_EXP__ (-382) -#define __cpp_decltype_auto 201304L -#define __DBL_DIG__ 15 -#define __STDC_EMBED_EMPTY__ 2 -#define __FLT_EPSILON__ 1.19209289550781250000000000000000000e-7F -#define __GXX_WEAK__ 1 -#define __SHRT_WIDTH__ 16 -#define __FLT32_IS_IEC_60559__ 1 -#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L -#define __DBL_IS_IEC_60559__ 1 -#define __DEC32_MAX__ 9.999999E96DF -#define __cpp_threadsafe_static_init 200806L -#define __cpp_enumerator_attributes 201411L -#define __FLT64X_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951F64x -#define __FLT32X_HAS_INFINITY__ 1 -#define __unix__ 1 -#define __INT_WIDTH__ 32 -#define __STDC_IEC_559__ 1 -#define __STDC_ISO_10646__ 201706L -#define __DECIMAL_DIG__ 21 -#define __STDC_IEC_559_COMPLEX__ 1 -#define __FLT64_EPSILON__ 2.22044604925031308084726333618164062e-16F64 -#define __gnu_linux__ 1 -#define __INT16_MAX__ 0x7fff -#define __FLT64_MIN_EXP__ (-1021) -#define __DEC64X_EPSILON__ 1E-33D64x -#define __FLT64X_MIN_10_EXP__ (-4931) -#define __LDBL_HAS_QUIET_NAN__ 1 -#define __FLT16_MIN_EXP__ (-13) -#define __FLT64_MANT_DIG__ 53 -#define __FLT64X_MANT_DIG__ 64 -#define __BFLT16_DIG__ 2 -#define __GNUC__ 15 -#define __GXX_RTTI 1 -#define __pie__ 2 -#define __MMX__ 1 -#define __FLT_HAS_DENORM__ 1 -#define __SIZEOF_LONG_DOUBLE__ 16 -#define __BIGGEST_ALIGNMENT__ 16 -#define __STDC_UTF_16__ 1 -#define __FLT64_MAX_10_EXP__ 308 -#define __BFLT16_IS_IEC_60559__ 0 -#define __FLT16_MAX_10_EXP__ 4 -#define __cpp_delegating_constructors 200604L -#define __DBL_MAX__ double(1.79769313486231570814527423731704357e+308L) -#define __cpp_raw_strings 200710L -#define __INT_FAST32_MAX__ 0x7fffffffffffffffL -#define __DBL_HAS_INFINITY__ 1 -#define __INT64_MAX__ 0x7fffffffffffffffL -#define __SIZEOF_FLOAT__ 4 -#define __HAVE_SPECULATION_SAFE_VALUE 1 -#define __cpp_fold_expressions 201603L -#define __DEC32_MIN_EXP__ (-94) -#define __INTPTR_WIDTH__ 64 -#define __UINT_LEAST32_MAX__ 0xffffffffU -#define __FLT32X_HAS_DENORM__ 1 -#define __INT_FAST16_TYPE__ long int -#define __MMX_WITH_SSE__ 1 -#define __LDBL_HAS_DENORM__ 1 -#define __SEG_GS 1 -#define __BFLT16_EPSILON__ 7.81250000000000000000000000000000000e-3BF16 -#define __cplusplus 201703L -#define __cpp_ref_qualifiers 200710L -#define __DEC32_MIN__ 1E-95DF -#define __DEPRECATED 1 -#define __cpp_rvalue_references 200610L -#define __DBL_MAX_EXP__ 1024 -#define __WCHAR_WIDTH__ 32 -#define __FLT32_MAX__ 3.40282346638528859811704183484516925e+38F32 -#define __DEC128_EPSILON__ 1E-33DL -#define __FLT16_DECIMAL_DIG__ 5 -#define __SSE2_MATH__ 1 -#define __ATOMIC_HLE_RELEASE 131072 -#define __PTRDIFF_MAX__ 0x7fffffffffffffffL -#define __amd64 1 -#define __DEC64X_MAX__ 9.999999999999999999999999999999999E6144D64x -#define __ATOMIC_HLE_ACQUIRE 65536 -#define __GNUG__ 15 -#define __LONG_LONG_MAX__ 0x7fffffffffffffffLL -#define __SIZEOF_SIZE_T__ 8 -#define __BFLT16_HAS_INFINITY__ 1 -#define __FLT64X_MIN_EXP__ (-16381) -#define __SIZEOF_WINT_T__ 4 -#define __FLT32X_DIG__ 15 -#define __LONG_LONG_WIDTH__ 64 -#define __cpp_initializer_lists 200806L -#define __FLT32_MAX_EXP__ 128 -#define __cpp_hex_float 201603L -#define __GXX_ABI_VERSION 1020 -#define __FLT_MIN_EXP__ (-125) -#define __GCC_HAVE_DWARF2_CFI_ASM 1 -#define __x86_64 1 -#define __cpp_lambdas 200907L -#define __INT_FAST64_TYPE__ long int -#define __BFLT16_MAX__ 3.38953138925153547590470800371487867e+38BF16 -#define __FLT64_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F64 -#define __cpp_template_auto 201606L -#define __FLT16_DENORM_MIN__ 5.96046447753906250000000000000000000e-8F16 -#define __FLT128_EPSILON__ 1.92592994438723585305597794258492732e-34F128 -#define __FLT64X_NORM_MAX__ 1.18973149535723176502126385303097021e+4932F64x -#define __SIZEOF_POINTER__ 8 -#define __SIZE_TYPE__ long unsigned int -#define __LP64__ 1 -#define __DBL_HAS_QUIET_NAN__ 1 -#define __FLT32X_EPSILON__ 2.22044604925031308084726333618164062e-16F32x -#define __LDBL_MAX_EXP__ 16384 -#define __DECIMAL_BID_FORMAT__ 1 -#define __FLT64_MIN_10_EXP__ (-307) -#define __FLT16_MIN_10_EXP__ (-4) -#define __FLT64X_DECIMAL_DIG__ 21 -#define __DEC128_MIN__ 1E-6143DL -#define __REGISTER_PREFIX__ -#define __UINT16_MAX__ 0xffff -#define __FLT128_HAS_INFINITY__ 1 -#define __FLT32_MIN__ 1.17549435082228750796873653722224568e-38F32 -#define __UINT8_TYPE__ unsigned char -#define __FLT_DIG__ 6 -#define __DEC_EVAL_METHOD__ 2 -#define __FLT_MANT_DIG__ 24 -#define __LDBL_DECIMAL_DIG__ 21 -#define __VERSION__ "15.2.1 20260103" -#define __UINT64_C(c) c ## UL -#define __cpp_unicode_characters 201411L -#define __DEC64X_MIN__ 1E-6143D64x -#define _STDC_PREDEF_H 1 -#define __INT_LEAST32_MAX__ 0x7fffffff -#define __GCC_ATOMIC_INT_LOCK_FREE 2 -#define __FLT128_MAX_EXP__ 16384 -#define __FLT32_MANT_DIG__ 24 -#define __cpp_decltype 200707L -#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__ -#define __FLT32X_MIN_EXP__ (-1021) -#define __STDC_IEC_60559_COMPLEX__ 201404L -#define __cpp_aggregate_bases 201603L -#define __BFLT16_MIN__ 1.17549435082228750796873653722224568e-38BF16 -#define __FLT128_HAS_DENORM__ 1 -#define __FLT32_DECIMAL_DIG__ 9 -#define __FLT128_DIG__ 33 -#define __INT32_C(c) c -#define __DEC64_EPSILON__ 1E-15DD -#define __ORDER_PDP_ENDIAN__ 3412 -#define __DEC128_MIN_EXP__ (-6142) -#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL -#define __INT_FAST32_TYPE__ long int -#define __UINT_LEAST16_TYPE__ short unsigned int -#define __DEC64X_MANT_DIG__ 34 -#define __DEC128_MAX_EXP__ 6145 -#define unix 1 -#define __DBL_HAS_DENORM__ 1 -#define __cpp_rtti 199711L -#define __UINT64_MAX__ 0xffffffffffffffffUL -#define __FLT_IS_IEC_60559__ 1 -#define __GNUC_WIDE_EXECUTION_CHARSET_NAME "UTF-32LE" -#define __FLT64X_DIG__ 18 -#define __INT8_TYPE__ signed char -#define __cpp_digit_separators 201309L -#define __ELF__ 1 -#define __GCC_ASM_FLAG_OUTPUTS__ 1 -#define __UINT32_TYPE__ unsigned int -#define __BFLT16_HAS_QUIET_NAN__ 1 -#define __FLT_RADIX__ 2 -#define __INT_LEAST16_TYPE__ short int -#define __LDBL_EPSILON__ 1.08420217248550443400745280086994171e-19L -#define __UINTMAX_C(c) c ## UL -#define __FLT16_DIG__ 3 -#define __k8 1 -#define __FLT32X_MIN__ 2.22507385850720138309023271733240406e-308F32x -#define __SIG_ATOMIC_MAX__ 0x7fffffff -#define __cpp_constexpr 201603L -#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2 -#define __USER_LABEL_PREFIX__ -#define __STDC_IEC_60559_BFP__ 201404L -#define __SIZEOF_PTRDIFF_T__ 8 -#define __FLT64X_HAS_INFINITY__ 1 -#define __SIZEOF_LONG__ 8 -#define __LDBL_DIG__ 18 -#define __FLT64_IS_IEC_60559__ 1 -#define __x86_64__ 1 -#define __FLT16_IS_IEC_60559__ 1 -#define __FLT16_MAX_EXP__ 16 -#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF -#define __STDC_EMBED_FOUND__ 1 -#define __INT_FAST16_MAX__ 0x7fffffffffffffffL -#define __GCC_CONSTRUCTIVE_SIZE 64 -#define __FLT64_DIG__ 15 -#define __UINT_FAST32_MAX__ 0xffffffffffffffffUL -#define __UINT_LEAST64_TYPE__ long unsigned int -#define __FLT16_EPSILON__ 9.76562500000000000000000000000000000e-4F16 -#define __FLT_HAS_QUIET_NAN__ 1 -#define __FLT_MAX_10_EXP__ 38 -#define __FLT64X_HAS_DENORM__ 1 -#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL -#define __FLT_HAS_INFINITY__ 1 -#define __GNUC_EXECUTION_CHARSET_NAME "UTF-8" -#define __cpp_unicode_literals 200710L -#define __UINT_FAST16_TYPE__ long unsigned int -#define __DEC64_MAX__ 9.999999999999999E384DD -#define __STDC_EMBED_NOT_FOUND__ 0 -#define __INT_FAST32_WIDTH__ 64 -#define __CHAR16_TYPE__ short unsigned int -#define __PRAGMA_REDEFINE_EXTNAME 1 -#define __DEC64X_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143D64x -#define __SIZE_WIDTH__ 64 -#define __SEG_FS 1 -#define __INT_LEAST16_MAX__ 0x7fff -#define __FLT16_NORM_MAX__ 6.55040000000000000000000000000000000e+4F16 -#define __DEC64_MANT_DIG__ 16 -#define __FLT32_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F32 -#define __SIG_ATOMIC_WIDTH__ 32 -#define __INT_LEAST64_TYPE__ long int -#define __INT16_TYPE__ short int -#define __INT_LEAST8_TYPE__ signed char -#define __FLT16_MAX__ 6.55040000000000000000000000000000000e+4F16 -#define __FLT128_MIN__ 3.36210314311209350626267781732175260e-4932F128 -#define __cpp_structured_bindings 201606L -#define __SIZEOF_INT__ 4 -#define __DEC32_MAX_EXP__ 97 -#define __INT_FAST8_MAX__ 0x7f -#define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128 -#define __INTPTR_MAX__ 0x7fffffffffffffffL -#define __cpp_sized_deallocation 201309L -#define __cpp_guaranteed_copy_elision 201606L -#define linux 1 -#define __FLT64_HAS_QUIET_NAN__ 1 -#define __FLT32_MIN_10_EXP__ (-37) -#define __EXCEPTIONS 1 -#define __UINT16_C(c) c -#define __PTRDIFF_WIDTH__ 64 -#define __cpp_range_based_for 201603L -#define __INT_FAST16_WIDTH__ 64 -#define __FLT64_HAS_INFINITY__ 1 -#define __FLT64X_MAX__ 1.18973149535723176502126385303097021e+4932F64x -#define __FLT16_HAS_INFINITY__ 1 -#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 16 -#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1) -#define __code_model_small__ 1 -#define __GCC_ATOMIC_LONG_LOCK_FREE 2 -#define __cpp_nontype_template_args 201411L -#define __DEC32_MANT_DIG__ 7 -#define __k8__ 1 -#define __INTPTR_TYPE__ long int -#define __UINT16_TYPE__ short unsigned int -#define __WCHAR_TYPE__ int -#define __pic__ 2 -#define __UINTPTR_MAX__ 0xffffffffffffffffUL -#define __INT_FAST64_WIDTH__ 64 -#define __INT_FAST64_MAX__ 0x7fffffffffffffffL -#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1 -#define __FLT_NORM_MAX__ 3.40282346638528859811704183484516925e+38F -#define __FLT32_HAS_INFINITY__ 1 -#define __FLT64X_MAX_EXP__ 16384 -#define __UINT_FAST64_TYPE__ long unsigned int -#define __cpp_inline_variables 201606L -#define __BFLT16_MIN_EXP__ (-125) -#define __INT_MAX__ 0x7fffffff -#define __linux__ 1 -#define __INT64_TYPE__ long int -#define __FLT_MAX_EXP__ 128 -#define __ORDER_BIG_ENDIAN__ 4321 -#define __DBL_MANT_DIG__ 53 -#define __SIZEOF_FLOAT128__ 16 -#define __BFLT16_MANT_DIG__ 8 -#define __DEC64_MIN__ 1E-383DD -#define __WINT_TYPE__ unsigned int -#define __UINT_LEAST32_TYPE__ unsigned int -#define __SIZEOF_SHORT__ 2 -#define __FLT32_NORM_MAX__ 3.40282346638528859811704183484516925e+38F32 -#define __SSE__ 1 -#define __LDBL_MIN_EXP__ (-16381) -#define __FLT64_MAX__ 1.79769313486231570814527423731704357e+308F64 -#define __DEC64X_MIN_EXP__ (-6142) -#define __amd64__ 1 -#define __WINT_WIDTH__ 32 -#define __INT_LEAST64_WIDTH__ 64 -#define __FLT32X_MAX_10_EXP__ 308 -#define __cpp_namespace_attributes 201411L -#define __SIZEOF_INT128__ 16 -#define __FLT16_MIN__ 6.10351562500000000000000000000000000e-5F16 -#define __FLT64X_IS_IEC_60559__ 1 -#define __GXX_CONSTEXPR_ASM__ 1 -#define __LDBL_MAX_10_EXP__ 4932 -#define __ATOMIC_RELAXED 0 -#define __DBL_EPSILON__ double(2.22044604925031308084726333618164062e-16L) -#define __INT_LEAST32_TYPE__ int -#define _LP64 1 -#define __UINT8_C(c) c -#define __FLT64_MAX_EXP__ 1024 -#define __cpp_return_type_deduction 201304L -#define __SIZEOF_WCHAR_T__ 4 -#define __GNUC_PATCHLEVEL__ 1 -#define __FLT128_NORM_MAX__ 1.18973149535723176508575932662800702e+4932F128 -#define __FLT64_NORM_MAX__ 1.79769313486231570814527423731704357e+308F64 -#define __FLT128_HAS_QUIET_NAN__ 1 -#define __INTMAX_MAX__ 0x7fffffffffffffffL -#define __INT_FAST8_TYPE__ signed char -#define __FLT64X_MIN__ 3.36210314311209350626267781732175260e-4932F64x -#define __STDCPP_THREADS__ 1 -#define __BFLT16_HAS_DENORM__ 1 -#define __GNUC_STDC_INLINE__ 1 -#define __FLT64_HAS_DENORM__ 1 -#define __FLT32_EPSILON__ 1.19209289550781250000000000000000000e-7F32 -#define __FLT16_HAS_DENORM__ 1 -#define __DBL_DECIMAL_DIG__ 17 -#define __STDC_UTF_32__ 1 -#define __INT_FAST8_WIDTH__ 8 -#define __FXSR__ 1 -#define __FLT32X_MAX__ 1.79769313486231570814527423731704357e+308F32x -#define __DBL_NORM_MAX__ double(1.79769313486231570814527423731704357e+308L) -#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ -#define __GCC_DESTRUCTIVE_SIZE 64 -#define __INTMAX_WIDTH__ 64 -#define __cpp_runtime_arrays 198712L -#define __FLT32_DIG__ 6 -#define __UINT64_TYPE__ long unsigned int -#define __UINT32_C(c) c ## U -#define __cpp_alias_templates 200704L -#define __FLT_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F -#define __FLT128_IS_IEC_60559__ 1 -#define __INT8_MAX__ 0x7f -#define __LONG_WIDTH__ 64 -#define __DBL_MIN__ double(2.22507385850720138309023271733240406e-308L) -#define __PIC__ 2 -#define __INT32_MAX__ 0x7fffffff -#define __UINT_FAST32_TYPE__ long unsigned int -#define __FLT16_MANT_DIG__ 11 -#define __FLT32X_NORM_MAX__ 1.79769313486231570814527423731704357e+308F32x -#define __CHAR32_TYPE__ unsigned int -#define __FLT_MAX__ 3.40282346638528859811704183484516925e+38F -#define __SSE2__ 1 -#define __cpp_deduction_guides 201703L -#define __BFLT16_NORM_MAX__ 3.38953138925153547590470800371487867e+38BF16 -#define __INT32_TYPE__ int -#define __SIZEOF_DOUBLE__ 8 -#define __cpp_exceptions 199711L -#define __FLT_MIN_10_EXP__ (-37) -#define __FLT64_MIN__ 2.22507385850720138309023271733240406e-308F64 -#define __INT_LEAST32_WIDTH__ 32 -#define __INTMAX_TYPE__ long int -#define __GLIBCXX_BITSIZE_INT_N_0 128 -#define __FLT32X_HAS_QUIET_NAN__ 1 -#define __ATOMIC_CONSUME 1 -#define __GNUC_MINOR__ 2 -#define __GLIBCXX_TYPE_INT_N_0 __int128 -#define __UINTMAX_MAX__ 0xffffffffffffffffUL -#define __PIE__ 2 -#define __FLT32X_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F32x -#define __cpp_template_template_args 201611L -#define __DBL_MAX_10_EXP__ 308 -#define __LDBL_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951L -#define __INT16_C(c) c -#define __STDC__ 1 -#define __PTRDIFF_TYPE__ long int -#define __LONG_MAX__ 0x7fffffffffffffffL -#define __FLT32X_MIN_10_EXP__ (-307) -#define __UINTPTR_TYPE__ long unsigned int -#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD -#define __DEC128_MANT_DIG__ 34 -#define __LDBL_MIN_10_EXP__ (-4931) -#define __cpp_generic_lambdas 201304L -#define __SSE_MATH__ 1 -#define __SIZEOF_LONG_LONG__ 8 -#define __cpp_user_defined_literals 200809L -#define __FLT128_DECIMAL_DIG__ 36 -#define __GCC_ATOMIC_LLONG_LOCK_FREE 2 -#define __FLT32_HAS_QUIET_NAN__ 1 -#define __FLT_DECIMAL_DIG__ 9 -#define __UINT_FAST16_MAX__ 0xffffffffffffffffUL -#define __LDBL_NORM_MAX__ 1.18973149535723176502126385303097021e+4932L -#define __GCC_ATOMIC_SHORT_LOCK_FREE 2 -#define __SIZE_MAX__ 0xffffffffffffffffUL -#define __UINT_FAST8_TYPE__ unsigned char -#define _GNU_SOURCE 1 -#define __cpp_init_captures 201304L -#define __ATOMIC_ACQ_REL 4 -#define __ATOMIC_RELEASE 3 diff --git a/res/xyz.uvos.aceradio.png b/res/xyz.uvos.aceradio.png new file mode 100644 index 0000000000000000000000000000000000000000..d1545de35a1da03c39c4920c7000fb77b28c72d1 GIT binary patch literal 3880 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 + + + + + + + + + + + + + diff --git a/AceStepWorker.cpp b/src/AceStepWorker.cpp similarity index 98% rename from AceStepWorker.cpp rename to src/AceStepWorker.cpp index c67eac3..8f9038f 100644 --- a/AceStepWorker.cpp +++ b/src/AceStepWorker.cpp @@ -180,7 +180,8 @@ void AceStepWorker::Worker::run() QFile lmOutputFile(requestLmOutputFile); if (lmOutputFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QJsonParseError parseError; - QJsonDocument doc = QJsonDocument::fromJson(lmOutputFile.readAll(), &parseError); + song.json = lmOutputFile.readAll(); + QJsonDocument doc = QJsonDocument::fromJson(song.json.toUtf8(), &parseError); lmOutputFile.close(); if (doc.isObject() && !parseError.error) { diff --git a/AceStepWorker.h b/src/AceStepWorker.h similarity index 100% rename from AceStepWorker.h rename to src/AceStepWorker.h diff --git a/AdvancedSettingsDialog.cpp b/src/AdvancedSettingsDialog.cpp similarity index 100% rename from AdvancedSettingsDialog.cpp rename to src/AdvancedSettingsDialog.cpp diff --git a/AdvancedSettingsDialog.h b/src/AdvancedSettingsDialog.h similarity index 100% rename from AdvancedSettingsDialog.h rename to src/AdvancedSettingsDialog.h diff --git a/AdvancedSettingsDialog.ui b/src/AdvancedSettingsDialog.ui similarity index 100% rename from AdvancedSettingsDialog.ui rename to src/AdvancedSettingsDialog.ui diff --git a/AudioPlayer.cpp b/src/AudioPlayer.cpp similarity index 100% rename from AudioPlayer.cpp rename to src/AudioPlayer.cpp diff --git a/AudioPlayer.h b/src/AudioPlayer.h similarity index 100% rename from AudioPlayer.h rename to src/AudioPlayer.h diff --git a/MainWindow.cpp b/src/MainWindow.cpp similarity index 90% rename from MainWindow.cpp rename to src/MainWindow.cpp index c5af068..4175c52 100644 --- a/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -43,7 +43,10 @@ MainWindow::MainWindow(QWidget *parent) connect(ui->actionAdvancedSettings, &QAction::triggered, this, &MainWindow::on_advancedSettingsButton_clicked); connect(ui->actionSavePlaylist, &QAction::triggered, this, &MainWindow::on_actionSavePlaylist); connect(ui->actionLoadPlaylist, &QAction::triggered, this, &MainWindow::on_actionLoadPlaylist); + connect(ui->actionAppendPlaylist, &QAction::triggered, this, &MainWindow::on_actionAppendPlaylist); + connect(ui->actionSaveSong, &QAction::triggered, this, &MainWindow::on_actionSaveSong); connect(ui->actionQuit, &QAction::triggered, this, [this](){close();}); + connect(ui->actionClearPlaylist, &QAction::triggered, this, [this](){songModel->clear();}); connect(audioPlayer, &AudioPlayer::playbackFinished, this, &MainWindow::playNextSong); connect(audioPlayer, &AudioPlayer::playbackStarted, this, &MainWindow::playbackStarted); connect(audioPlayer, &AudioPlayer::positionChanged, this, &MainWindow::updatePosition); @@ -202,6 +205,9 @@ void MainWindow::on_playButton_clicked() return; } + if(songModel->empty()) + return; + isPlaying = true; ui->nowPlayingLabel->setText("Now Playing: Waiting for generation..."); flushGenerationQueue(); @@ -281,13 +287,16 @@ void MainWindow::on_songListView_doubleClicked(const QModelIndex &index) // Column 0 (play indicator): Stop current playback and play this song if (isPlaying) { audioPlayer->stop(); + } else { + isPlaying = true; + updateControls(); } // Flush the generation queue when user selects a different song flushGenerationQueue(); currentSong = songModel->getSong(row); ensureSongsInQueue(true); - } else if (index.column() == 1) { + } else if (index.column() == 1 || index.column() == 2) { // Column 1 (caption): Edit the song SongItem song = songModel->getSong(row); @@ -372,9 +381,8 @@ void MainWindow::playSong(const SongItem& song) audioPlayer->play(song.file); songModel->setPlayingIndex(songModel->findSongIndexById(song.uniqueId)); ui->nowPlayingLabel->setText("Now Playing: " + song.caption); - - // Update lyrics display ui->lyricsTextEdit->setPlainText(song.lyrics); + ui->jsonTextEdit->setPlainText(song.json); } void MainWindow::songGenerated(const SongItem& song) @@ -515,9 +523,49 @@ void MainWindow::on_actionLoadPlaylist() QString filePath = QFileDialog::getOpenFileName(this, "Load Playlist", QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "JSON Files (*.json);;All Files (*)"); - if (!filePath.isEmpty()) { - loadPlaylist(); + songModel->clear(); + flushGenerationQueue(); + loadPlaylist(filePath); + } +} + +void MainWindow::on_actionAppendPlaylist() +{ + QString filePath = QFileDialog::getOpenFileName(this, "Load Playlist", + QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), + "JSON Files (*.json);;All Files (*)"); + if (!filePath.isEmpty()) { + loadPlaylist(filePath); + } +} + +void MainWindow::on_actionSaveSong() +{ + QString filePath = QFileDialog::getSaveFileName(this, "Save Playlist", + QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/song.json", + "JSON Files (*.json);;All Files (*)"); + if (!filePath.isEmpty()) { + QJsonArray songsArray; + QJsonParseError parseError; + QJsonDocument songDoc = QJsonDocument::fromJson(currentSong.json.toUtf8(), &parseError); + if(parseError.error) + return; + songsArray.append(songDoc.object()); + + QJsonObject rootObj; + rootObj["songs"] = songsArray; + rootObj["version"] = "1.0"; + + QJsonDocument doc(rootObj); + QByteArray jsonData = doc.toJson(); + + QFile file(filePath); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) + return; + QFile::copy(currentSong.file, filePath + ".wav"); + file.write(jsonData); + file.close(); } } @@ -532,24 +580,13 @@ void MainWindow::savePlaylist(const QString &filePath) savePlaylistToJson(filePath, songs); } -void MainWindow::loadPlaylist() +void MainWindow::loadPlaylist(const QString& filePath) { - QString filePath = QFileDialog::getOpenFileName(this, "Load Playlist", - QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), - "JSON Files (*.json);;All Files (*)"); - - if (!filePath.isEmpty()) { - QList songs; - if (loadPlaylistFromJson(filePath, songs)) { - // Clear current playlist - while (songModel->rowCount() > 0) { - songModel->removeSong(0); - } - - // Add loaded songs - for (const SongItem &song : songs) { - songModel->addSong(song); - } + QList songs; + if (loadPlaylistFromJson(filePath, songs)) { + // Add loaded songs + for (const SongItem &song : songs) { + songModel->addSong(song); } } } @@ -583,14 +620,9 @@ void MainWindow::autoLoadPlaylist() if (QFile::exists(filePath)) { QList songs; if (loadPlaylistFromJson(filePath, songs)) { - // Clear default songs and add loaded ones - while (songModel->rowCount() > 0) { - songModel->removeSong(0); - } - - for (const SongItem &song : songs) { + songModel->clear(); + for (const SongItem &song : songs) songModel->addSong(song); - } } } } @@ -634,6 +666,8 @@ bool MainWindow::loadPlaylistFromJson(const QString &filePath, QList & qWarning() << "Could not open file for reading:" << filePath; return false; } + + qDebug()<<"Loading from"< & } QJsonArray songsArray = rootObj["songs"].toArray(); + + qDebug()<<"Loading"< + + + Info + + + + + + true + + + + + Lyrics @@ -118,15 +132,12 @@ - + false - true - - - Qt::Orientation::Horizontal + false @@ -250,8 +261,11 @@ File + + + @@ -302,7 +316,38 @@ Ctrl+Q + + + + + + Clear Playlist + + + + + + + + Save Song + + + + + + + + Append Playlist + + + + + ClickableSlider + QWidget +
clickableslider.h
+
+
diff --git a/SongDialog.cpp b/src/SongDialog.cpp similarity index 100% rename from SongDialog.cpp rename to src/SongDialog.cpp diff --git a/SongDialog.h b/src/SongDialog.h similarity index 100% rename from SongDialog.h rename to src/SongDialog.h diff --git a/SongDialog.ui b/src/SongDialog.ui similarity index 100% rename from SongDialog.ui rename to src/SongDialog.ui diff --git a/SongItem.h b/src/SongItem.h similarity index 71% rename from SongItem.h rename to src/SongItem.h index a3d8969..46ba137 100644 --- a/SongItem.h +++ b/src/SongItem.h @@ -7,9 +7,10 @@ class SongItem { public: QString caption; QString lyrics; - uint64_t uniqueId; // Unique identifier for tracking across playlist changes + uint64_t uniqueId; QString file; - QString vocalLanguage; // Language override for vocal generation (ISO 639 code or empty) + QString vocalLanguage; + QString json; inline SongItem(const QString &caption = "", const QString &lyrics = "") : caption(caption), lyrics(lyrics) { diff --git a/SongListModel.cpp b/src/SongListModel.cpp similarity index 96% rename from SongListModel.cpp rename to src/SongListModel.cpp index bb48a18..8966df2 100644 --- a/SongListModel.cpp +++ b/src/SongListModel.cpp @@ -126,6 +126,18 @@ void SongListModel::removeSong(int index) } } +void SongListModel::clear() +{ + beginRemoveRows(QModelIndex(), 0, songList.size()-1); + songList.clear(); + endRemoveRows(); +} + +bool SongListModel::empty() +{ + return songList.empty(); +} + SongItem SongListModel::getSong(int index) const { if (index >= 0 && index < songList.size()) { diff --git a/SongListModel.h b/src/SongListModel.h similarity index 96% rename from SongListModel.h rename to src/SongListModel.h index 9d0f713..46c6a5b 100644 --- a/SongListModel.h +++ b/src/SongListModel.h @@ -38,6 +38,7 @@ public: void removeSong(int index); SongItem getSong(int index) const; int findNextIndex(int currentIndex, bool shuffle = false) const; + void clear(); // Playing indicator void setPlayingIndex(int index); @@ -45,7 +46,8 @@ public: // Find song by unique ID int findSongIndexById(uint64_t uniqueId) const; - int songCount(); + int songCount(); + bool empty(); private: QList songList; diff --git a/src/clickableslider.cpp b/src/clickableslider.cpp new file mode 100644 index 0000000..a6262ee --- /dev/null +++ b/src/clickableslider.cpp @@ -0,0 +1,60 @@ +#include "clickableslider.h" +#include + +ClickableSlider::ClickableSlider(QWidget *parent) + : QSlider(Qt::Orientation::Horizontal, parent) +{ +} + +ClickableSlider::ClickableSlider(Qt::Orientation orientation, QWidget *parent) + : QSlider(orientation, parent) +{ +} + +void ClickableSlider::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + int val = pixelPosToRangeValue(event->pos()); + + // Block signals temporarily to avoid infinite recursion + blockSignals(true); + setValue(val); + blockSignals(false); + + // Emit both valueChanged and sliderMoved signals for compatibility + emit valueChanged(val); + emit sliderMoved(val); + } else { + // Call base class implementation for other buttons + QSlider::mousePressEvent(event); + } +} + +int ClickableSlider::pixelPosToRangeValue(const QPoint &pos) +{ + QStyleOptionSlider opt; + initStyleOption(&opt); + + QRect gr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this); + QRect sr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); + + int sliderLength; + int sliderMin; + int sliderMax; + + if (orientation() == Qt::Horizontal) { + sliderLength = sr.width(); + sliderMin = gr.x(); + sliderMax = gr.right() - sliderLength + 1; + } else { + sliderLength = sr.height(); + sliderMin = gr.y(); + sliderMax = gr.bottom() - sliderLength + 1; + } + + QPoint pr = pos - sr.center() + sr.topLeft(); + int p = orientation() == Qt::Horizontal ? pr.x() : pr.y(); + + return QStyle::sliderValueFromPosition(minimum(), maximum(), p - sliderMin, + sliderMax - sliderMin, opt.upsideDown); +} diff --git a/src/clickableslider.h b/src/clickableslider.h new file mode 100644 index 0000000..14a152d --- /dev/null +++ b/src/clickableslider.h @@ -0,0 +1,22 @@ +#ifndef CLICKABLESLIDER_H +#define CLICKABLESLIDER_H + +#include +#include +#include + +class ClickableSlider : public QSlider +{ + Q_OBJECT +public: + explicit ClickableSlider(QWidget *parent = nullptr); + explicit ClickableSlider(Qt::Orientation orientation, QWidget *parent = nullptr); + +protected: + void mousePressEvent(QMouseEvent *event) override; + +private: + int pixelPosToRangeValue(const QPoint &pos); +}; + +#endif // CLICKABLESLIDER_H \ No newline at end of file diff --git a/main.cpp b/src/main.cpp similarity index 100% rename from main.cpp rename to src/main.cpp