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
+
+
+
+
+
+ ClickableSlider
+ QWidget
+
+
+
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