Add icons refactor repo structure
This commit is contained in:
parent
1fec61140c
commit
b719d8cf96
24 changed files with 317 additions and 594 deletions
|
|
@ -14,23 +14,25 @@ set(CMAKE_AUTOUIC ON)
|
||||||
|
|
||||||
# Add executable
|
# Add executable
|
||||||
add_executable(${PROJECT_NAME}
|
add_executable(${PROJECT_NAME}
|
||||||
main.cpp
|
src/main.cpp
|
||||||
MainWindow.ui
|
src/MainWindow.ui
|
||||||
MainWindow.cpp
|
src/MainWindow.cpp
|
||||||
MainWindow.h
|
src/MainWindow.h
|
||||||
AdvancedSettingsDialog.ui
|
src/AdvancedSettingsDialog.ui
|
||||||
AdvancedSettingsDialog.cpp
|
src/AdvancedSettingsDialog.cpp
|
||||||
AdvancedSettingsDialog.h
|
src/AdvancedSettingsDialog.h
|
||||||
SongDialog.ui
|
src/SongDialog.ui
|
||||||
SongDialog.cpp
|
src/SongDialog.cpp
|
||||||
SongDialog.h
|
src/SongDialog.h
|
||||||
SongListModel.cpp
|
src/SongListModel.cpp
|
||||||
SongListModel.h
|
src/SongListModel.h
|
||||||
AudioPlayer.cpp
|
src/AudioPlayer.cpp
|
||||||
AudioPlayer.h
|
src/AudioPlayer.h
|
||||||
AceStepWorker.cpp
|
src/AceStepWorker.cpp
|
||||||
AceStepWorker.h
|
src/AceStepWorker.h
|
||||||
SongItem.h
|
src/SongItem.h
|
||||||
|
src/clickableslider.h
|
||||||
|
src/clickableslider.cpp
|
||||||
${MusicGeneratorGUI_H}
|
${MusicGeneratorGUI_H}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
78
README.md
78
README.md
|
|
@ -1,88 +1,36 @@
|
||||||
# Music Generator GUI
|
# Aceradio
|
||||||
|
|
||||||
A Qt-based graphical user interface for generating music using acestep.cpp.
|
A C++ Qt 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
|
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
- Qt 5 or Qt 6 (with Core, Gui, Widgets, and Multimedia modules)
|
- Qt 6 Core, Gui, Widgets, and Multimedia
|
||||||
- CMake 3.14+
|
- CMake 3.14+
|
||||||
- acestep.cpp properly built with models downloaded
|
- acestep.cpp (bring your own binaries)
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
### Build acestep.cpp first:
|
### Build acestep.cpp first:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
git clone https://github.com/ServeurpersoCom/acestep.cpp.git
|
||||||
cd acestep.cpp
|
cd acestep.cpp
|
||||||
git submodule update --init
|
|
||||||
mkdir build && cd build
|
mkdir build && cd build
|
||||||
cmake .. -DGGML_BLAS=ON # or other backend options
|
cmake .. -DGGML_VULKAN=ON # or other backend
|
||||||
cmake --build . --config Release -j$(nproc)
|
make -j$(nproc)
|
||||||
./models.sh # Download models (requires ~7.7 GB free space)
|
./models.sh # Download models (requires ~7.7 GB free space)
|
||||||
```
|
```
|
||||||
|
|
||||||
### Build the GUI application:
|
### Build the GUI:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd ..
|
git clone git@github.com:IMbackK/aceradio.git
|
||||||
|
cd aceradio
|
||||||
mkdir build && cd build
|
mkdir build && cd build
|
||||||
cmake ..
|
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
|
Go to settings->Ace Step->Model Paths and add the paths to the acestep.cpp binaries the models.
|
||||||
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
|
|
||||||
|
|
|
||||||
473
moc_predefs.h
473
moc_predefs.h
|
|
@ -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
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
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 |
|
|
@ -180,7 +180,8 @@ void AceStepWorker::Worker::run()
|
||||||
QFile lmOutputFile(requestLmOutputFile);
|
QFile lmOutputFile(requestLmOutputFile);
|
||||||
if (lmOutputFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
if (lmOutputFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
QJsonParseError parseError;
|
QJsonParseError parseError;
|
||||||
QJsonDocument doc = QJsonDocument::fromJson(lmOutputFile.readAll(), &parseError);
|
song.json = lmOutputFile.readAll();
|
||||||
|
QJsonDocument doc = QJsonDocument::fromJson(song.json.toUtf8(), &parseError);
|
||||||
lmOutputFile.close();
|
lmOutputFile.close();
|
||||||
|
|
||||||
if (doc.isObject() && !parseError.error) {
|
if (doc.isObject() && !parseError.error) {
|
||||||
|
|
@ -43,7 +43,10 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
connect(ui->actionAdvancedSettings, &QAction::triggered, this, &MainWindow::on_advancedSettingsButton_clicked);
|
connect(ui->actionAdvancedSettings, &QAction::triggered, this, &MainWindow::on_advancedSettingsButton_clicked);
|
||||||
connect(ui->actionSavePlaylist, &QAction::triggered, this, &MainWindow::on_actionSavePlaylist);
|
connect(ui->actionSavePlaylist, &QAction::triggered, this, &MainWindow::on_actionSavePlaylist);
|
||||||
connect(ui->actionLoadPlaylist, &QAction::triggered, this, &MainWindow::on_actionLoadPlaylist);
|
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->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::playbackFinished, this, &MainWindow::playNextSong);
|
||||||
connect(audioPlayer, &AudioPlayer::playbackStarted, this, &MainWindow::playbackStarted);
|
connect(audioPlayer, &AudioPlayer::playbackStarted, this, &MainWindow::playbackStarted);
|
||||||
connect(audioPlayer, &AudioPlayer::positionChanged, this, &MainWindow::updatePosition);
|
connect(audioPlayer, &AudioPlayer::positionChanged, this, &MainWindow::updatePosition);
|
||||||
|
|
@ -202,6 +205,9 @@ void MainWindow::on_playButton_clicked()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(songModel->empty())
|
||||||
|
return;
|
||||||
|
|
||||||
isPlaying = true;
|
isPlaying = true;
|
||||||
ui->nowPlayingLabel->setText("Now Playing: Waiting for generation...");
|
ui->nowPlayingLabel->setText("Now Playing: Waiting for generation...");
|
||||||
flushGenerationQueue();
|
flushGenerationQueue();
|
||||||
|
|
@ -281,13 +287,16 @@ void MainWindow::on_songListView_doubleClicked(const QModelIndex &index)
|
||||||
// Column 0 (play indicator): Stop current playback and play this song
|
// Column 0 (play indicator): Stop current playback and play this song
|
||||||
if (isPlaying) {
|
if (isPlaying) {
|
||||||
audioPlayer->stop();
|
audioPlayer->stop();
|
||||||
|
} else {
|
||||||
|
isPlaying = true;
|
||||||
|
updateControls();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flush the generation queue when user selects a different song
|
// Flush the generation queue when user selects a different song
|
||||||
flushGenerationQueue();
|
flushGenerationQueue();
|
||||||
currentSong = songModel->getSong(row);
|
currentSong = songModel->getSong(row);
|
||||||
ensureSongsInQueue(true);
|
ensureSongsInQueue(true);
|
||||||
} else if (index.column() == 1) {
|
} else if (index.column() == 1 || index.column() == 2) {
|
||||||
// Column 1 (caption): Edit the song
|
// Column 1 (caption): Edit the song
|
||||||
SongItem song = songModel->getSong(row);
|
SongItem song = songModel->getSong(row);
|
||||||
|
|
||||||
|
|
@ -372,9 +381,8 @@ void MainWindow::playSong(const SongItem& song)
|
||||||
audioPlayer->play(song.file);
|
audioPlayer->play(song.file);
|
||||||
songModel->setPlayingIndex(songModel->findSongIndexById(song.uniqueId));
|
songModel->setPlayingIndex(songModel->findSongIndexById(song.uniqueId));
|
||||||
ui->nowPlayingLabel->setText("Now Playing: " + song.caption);
|
ui->nowPlayingLabel->setText("Now Playing: " + song.caption);
|
||||||
|
|
||||||
// Update lyrics display
|
|
||||||
ui->lyricsTextEdit->setPlainText(song.lyrics);
|
ui->lyricsTextEdit->setPlainText(song.lyrics);
|
||||||
|
ui->jsonTextEdit->setPlainText(song.json);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::songGenerated(const SongItem& song)
|
void MainWindow::songGenerated(const SongItem& song)
|
||||||
|
|
@ -515,9 +523,49 @@ void MainWindow::on_actionLoadPlaylist()
|
||||||
QString filePath = QFileDialog::getOpenFileName(this, "Load Playlist",
|
QString filePath = QFileDialog::getOpenFileName(this, "Load Playlist",
|
||||||
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation),
|
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation),
|
||||||
"JSON Files (*.json);;All Files (*)");
|
"JSON Files (*.json);;All Files (*)");
|
||||||
|
|
||||||
if (!filePath.isEmpty()) {
|
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,27 +580,16 @@ void MainWindow::savePlaylist(const QString &filePath)
|
||||||
savePlaylistToJson(filePath, songs);
|
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;
|
QList<SongItem> songs;
|
||||||
if (loadPlaylistFromJson(filePath, songs)) {
|
if (loadPlaylistFromJson(filePath, songs)) {
|
||||||
// Clear current playlist
|
|
||||||
while (songModel->rowCount() > 0) {
|
|
||||||
songModel->removeSong(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add loaded songs
|
// Add loaded songs
|
||||||
for (const SongItem &song : songs) {
|
for (const SongItem &song : songs) {
|
||||||
songModel->addSong(song);
|
songModel->addSong(song);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::autoSavePlaylist()
|
void MainWindow::autoSavePlaylist()
|
||||||
{
|
{
|
||||||
|
|
@ -583,17 +620,12 @@ void MainWindow::autoLoadPlaylist()
|
||||||
if (QFile::exists(filePath)) {
|
if (QFile::exists(filePath)) {
|
||||||
QList<SongItem> songs;
|
QList<SongItem> songs;
|
||||||
if (loadPlaylistFromJson(filePath, songs)) {
|
if (loadPlaylistFromJson(filePath, songs)) {
|
||||||
// Clear default songs and add loaded ones
|
songModel->clear();
|
||||||
while (songModel->rowCount() > 0) {
|
for (const SongItem &song : songs)
|
||||||
songModel->removeSong(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const SongItem &song : songs) {
|
|
||||||
songModel->addSong(song);
|
songModel->addSong(song);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
bool MainWindow::savePlaylistToJson(const QString &filePath, const QList<SongItem> &songs)
|
bool MainWindow::savePlaylistToJson(const QString &filePath, const QList<SongItem> &songs)
|
||||||
{
|
{
|
||||||
|
|
@ -635,6 +667,8 @@ bool MainWindow::loadPlaylistFromJson(const QString &filePath, QList<SongItem> &
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qDebug()<<"Loading from"<<filePath;
|
||||||
|
|
||||||
QByteArray jsonData = file.readAll();
|
QByteArray jsonData = file.readAll();
|
||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
|
|
@ -666,6 +700,8 @@ bool MainWindow::loadPlaylistFromJson(const QString &filePath, QList<SongItem> &
|
||||||
|
|
||||||
QJsonArray songsArray = rootObj["songs"].toArray();
|
QJsonArray songsArray = rootObj["songs"].toArray();
|
||||||
|
|
||||||
|
qDebug()<<"Loading"<<songsArray.size()<<"songs";
|
||||||
|
|
||||||
for (const QJsonValue &value : songsArray) {
|
for (const QJsonValue &value : songsArray) {
|
||||||
if (!value.isObject()) continue;
|
if (!value.isObject()) continue;
|
||||||
|
|
||||||
|
|
@ -51,6 +51,8 @@ private slots:
|
||||||
|
|
||||||
void on_actionSavePlaylist();
|
void on_actionSavePlaylist();
|
||||||
void on_actionLoadPlaylist();
|
void on_actionLoadPlaylist();
|
||||||
|
void on_actionAppendPlaylist();
|
||||||
|
void on_actionSaveSong();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void startNextSongGeneration();
|
void startNextSongGeneration();
|
||||||
|
|
@ -85,7 +87,7 @@ private:
|
||||||
private:
|
private:
|
||||||
void loadSettings();
|
void loadSettings();
|
||||||
void saveSettings();
|
void saveSettings();
|
||||||
void loadPlaylist();
|
void loadPlaylist(const QString &filePath);
|
||||||
void savePlaylist(const QString &filePath);
|
void savePlaylist(const QString &filePath);
|
||||||
void autoSavePlaylist();
|
void autoSavePlaylist();
|
||||||
void autoLoadPlaylist();
|
void autoLoadPlaylist();
|
||||||
|
|
@ -43,6 +43,20 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</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">
|
<widget class="QWidget" name="lyricsTab">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>Lyrics</string>
|
<string>Lyrics</string>
|
||||||
|
|
@ -118,15 +132,12 @@
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QSlider" name="positionSlider">
|
<widget class="ClickableSlider" name="positionSlider" native="true">
|
||||||
<property name="mouseTracking">
|
<property name="mouseTracking">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="tabletTracking">
|
<property name="tabletTracking">
|
||||||
<bool>true</bool>
|
<bool>false</bool>
|
||||||
</property>
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Orientation::Horizontal</enum>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
@ -250,8 +261,11 @@
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>File</string>
|
<string>File</string>
|
||||||
</property>
|
</property>
|
||||||
|
<addaction name="actionSaveSong"/>
|
||||||
<addaction name="actionSavePlaylist"/>
|
<addaction name="actionSavePlaylist"/>
|
||||||
<addaction name="actionLoadPlaylist"/>
|
<addaction name="actionLoadPlaylist"/>
|
||||||
|
<addaction name="actionAppendPlaylist"/>
|
||||||
|
<addaction name="actionClearPlaylist"/>
|
||||||
<addaction name="actionQuit"/>
|
<addaction name="actionQuit"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menuSettings">
|
<widget class="QMenu" name="menuSettings">
|
||||||
|
|
@ -302,7 +316,38 @@
|
||||||
<string>Ctrl+Q</string>
|
<string>Ctrl+Q</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</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>
|
</widget>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>ClickableSlider</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>clickableslider.h</header>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
|
@ -7,9 +7,10 @@ class SongItem {
|
||||||
public:
|
public:
|
||||||
QString caption;
|
QString caption;
|
||||||
QString lyrics;
|
QString lyrics;
|
||||||
uint64_t uniqueId; // Unique identifier for tracking across playlist changes
|
uint64_t uniqueId;
|
||||||
QString file;
|
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 = "")
|
inline SongItem(const QString &caption = "", const QString &lyrics = "")
|
||||||
: caption(caption), lyrics(lyrics) {
|
: caption(caption), lyrics(lyrics) {
|
||||||
|
|
@ -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
|
SongItem SongListModel::getSong(int index) const
|
||||||
{
|
{
|
||||||
if (index >= 0 && index < songList.size()) {
|
if (index >= 0 && index < songList.size()) {
|
||||||
|
|
@ -38,6 +38,7 @@ public:
|
||||||
void removeSong(int index);
|
void removeSong(int index);
|
||||||
SongItem getSong(int index) const;
|
SongItem getSong(int index) const;
|
||||||
int findNextIndex(int currentIndex, bool shuffle = false) const;
|
int findNextIndex(int currentIndex, bool shuffle = false) const;
|
||||||
|
void clear();
|
||||||
|
|
||||||
// Playing indicator
|
// Playing indicator
|
||||||
void setPlayingIndex(int index);
|
void setPlayingIndex(int index);
|
||||||
|
|
@ -46,6 +47,7 @@ public:
|
||||||
// Find song by unique ID
|
// Find song by unique ID
|
||||||
int findSongIndexById(uint64_t uniqueId) const;
|
int findSongIndexById(uint64_t uniqueId) const;
|
||||||
int songCount();
|
int songCount();
|
||||||
|
bool empty();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<SongItem> songList;
|
QList<SongItem> songList;
|
||||||
60
src/clickableslider.cpp
Normal file
60
src/clickableslider.cpp
Normal 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
22
src/clickableslider.h
Normal 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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue