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 0000000..d1545de Binary files /dev/null and b/res/xyz.uvos.aceradio.png differ diff --git a/res/xyz.uvos.aceradio.svg b/res/xyz.uvos.aceradio.svg new file mode 100644 index 0000000..23516fd --- /dev/null +++ b/res/xyz.uvos.aceradio.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + 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