Add icons refactor repo structure

This commit is contained in:
Carl Philipp Klemm 2026-03-05 23:46:29 +01:00
parent 1fec61140c
commit b719d8cf96
24 changed files with 317 additions and 594 deletions

View file

@ -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}
)

View file

@ -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.

View file

@ -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

BIN
res/xyz.uvos.aceradio.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

65
res/xyz.uvos.aceradio.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -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) {

View file

@ -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,26 +580,15 @@ 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<SongItem> 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);
}
}
}
}
void MainWindow::autoSavePlaylist()
@ -583,16 +620,11 @@ void MainWindow::autoLoadPlaylist()
if (QFile::exists(filePath)) {
QList<SongItem> 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);
}
}
}
}
bool MainWindow::savePlaylistToJson(const QString &filePath, const QList<SongItem> &songs)
@ -635,6 +667,8 @@ bool MainWindow::loadPlaylistFromJson(const QString &filePath, QList<SongItem> &
return false;
}
qDebug()<<"Loading from"<<filePath;
QByteArray jsonData = file.readAll();
file.close();
@ -666,6 +700,8 @@ bool MainWindow::loadPlaylistFromJson(const QString &filePath, QList<SongItem> &
QJsonArray songsArray = rootObj["songs"].toArray();
qDebug()<<"Loading"<<songsArray.size()<<"songs";
for (const QJsonValue &value : songsArray) {
if (!value.isObject()) continue;

View file

@ -51,6 +51,8 @@ private slots:
void on_actionSavePlaylist();
void on_actionLoadPlaylist();
void on_actionAppendPlaylist();
void on_actionSaveSong();
private:
void startNextSongGeneration();
@ -85,7 +87,7 @@ private:
private:
void loadSettings();
void saveSettings();
void loadPlaylist();
void loadPlaylist(const QString &filePath);
void savePlaylist(const QString &filePath);
void autoSavePlaylist();
void autoLoadPlaylist();

View file

@ -43,6 +43,20 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="infoTab">
<attribute name="title">
<string>Info</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPlainTextEdit" name="jsonTextEdit">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="lyricsTab">
<attribute name="title">
<string>Lyrics</string>
@ -118,15 +132,12 @@
</widget>
</item>
<item>
<widget class="QSlider" name="positionSlider">
<widget class="ClickableSlider" name="positionSlider" native="true">
<property name="mouseTracking">
<bool>false</bool>
</property>
<property name="tabletTracking">
<bool>true</bool>
</property>
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
<bool>false</bool>
</property>
</widget>
</item>
@ -250,8 +261,11 @@
<property name="title">
<string>File</string>
</property>
<addaction name="actionSaveSong"/>
<addaction name="actionSavePlaylist"/>
<addaction name="actionLoadPlaylist"/>
<addaction name="actionAppendPlaylist"/>
<addaction name="actionClearPlaylist"/>
<addaction name="actionQuit"/>
</widget>
<widget class="QMenu" name="menuSettings">
@ -302,7 +316,38 @@
<string>Ctrl+Q</string>
</property>
</action>
<action name="actionClearPlaylist">
<property name="icon">
<iconset theme="QIcon::ThemeIcon::EditDelete"/>
</property>
<property name="text">
<string>Clear Playlist</string>
</property>
</action>
<action name="actionSaveSong">
<property name="icon">
<iconset theme="QIcon::ThemeIcon::DocumentSaveAs"/>
</property>
<property name="text">
<string>Save Song</string>
</property>
</action>
<action name="actionAppendPlaylist">
<property name="icon">
<iconset theme="QIcon::ThemeIcon::DocumentOpen"/>
</property>
<property name="text">
<string>Append Playlist</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>
<class>ClickableSlider</class>
<extends>QWidget</extends>
<header>clickableslider.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View file

@ -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) {

View file

@ -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()) {

View file

@ -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);
@ -46,6 +47,7 @@ public:
// Find song by unique ID
int findSongIndexById(uint64_t uniqueId) const;
int songCount();
bool empty();
private:
QList<SongItem> songList;

60
src/clickableslider.cpp Normal file
View file

@ -0,0 +1,60 @@
#include "clickableslider.h"
#include <QStyle>
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);
}

22
src/clickableslider.h Normal file
View file

@ -0,0 +1,22 @@
#ifndef CLICKABLESLIDER_H
#define CLICKABLESLIDER_H
#include <QSlider>
#include <QStyleOptionSlider>
#include <QMouseEvent>
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