Compare commits
21 Commits
Author | SHA1 | Date |
---|---|---|
Igor Korsukov | cafefd7689 | |
Igor Korsukov | 3b8728d034 | |
Igor Korsukov | 89792908e9 | |
Igor Korsukov | 4baba6ef45 | |
Igor Korsukov | fcf16719ad | |
pereverzev_v | 0f5cebe66b | |
vpereverzev | 02fb378c4f | |
vpereverzev | c927a4b41b | |
RomanPudashkin | c6b3ddb575 | |
Eism | c7756a9591 | |
Michele Spagnolo | 4466e21d36 | |
Michele Spagnolo | 4ed987c60b | |
Michele Spagnolo | fa4b3a9592 | |
Michele Spagnolo | dc6fd951de | |
Michele Spagnolo | 630f5726d4 | |
pereverzev_v | 45f370bbf3 | |
RomanPudashkin | 5bc161142d | |
vpereverzev | bc7a9b9203 | |
vpereverzev | 88c0b6d92c | |
pereverzev_v | 13c094c92c | |
Igor Korsukov | 760274a6ad |
|
@ -69,7 +69,7 @@ IF %PACKAGE_TYPE% == "msi" (
|
|||
)
|
||||
|
||||
:: Temporary disabled, while we getting a new certificate
|
||||
SET DO_SIGN=OFF
|
||||
:: SET DO_SIGN=OFF
|
||||
|
||||
SET /p BUILD_VERSION=<%ARTIFACTS_DIR%\env\build_version.env
|
||||
SET /p BUILD_DATETIME=<%ARTIFACTS_DIR%\env\build_datetime.env
|
||||
|
@ -135,11 +135,11 @@ GOTO END_SUCCESS
|
|||
ECHO "Start msi packing..."
|
||||
:: sign dlls and exe files
|
||||
IF %DO_SIGN% == ON (
|
||||
7z x -y build\ci\windows\resources\musescore.p12.enc -obuild\ci\windows\resources\ -p%SIGN_CERTIFICATE_ENCRYPT_SECRET%
|
||||
7z x -y build\ci\windows\resources\musescore.pfx.enc -obuild\ci\windows\resources\ -p%SIGN_CERTIFICATE_ENCRYPT_SECRET%
|
||||
|
||||
for /f "delims=" %%f in ('dir /a-d /b /s "%INSTALL_DIR%\*.dll" "%INSTALL_DIR%\*.exe"') do (
|
||||
ECHO "Signing %%f"
|
||||
%SIGNTOOL% sign /debug /f "build\ci\windows\resources\musescore.p12" /t http://timestamp.verisign.com/scripts/timstamp.dll /p %SIGN_CERTIFICATE_PASSWORD% "%%f"
|
||||
%SIGNTOOL% sign /debug /f "build\ci\windows\resources\musescore.pfx" /t http://timestamp.digicert.com /p %SIGN_CERTIFICATE_PASSWORD% "%%f"
|
||||
)
|
||||
|
||||
) ELSE (
|
||||
|
|
Binary file not shown.
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.2</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -135,7 +135,7 @@
|
|||
<barNoteDistance>1.3</barNoteDistance>
|
||||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<measureRepeatNumberPos>-0.5</measureRepeatNumberPos>
|
||||
<mrNumberSeries>0</mrNumberSeries>
|
||||
<mrNumberEveryXMeasures>4</mrNumberEveryXMeasures>
|
||||
|
|
|
@ -154,6 +154,11 @@ void AutobotInteractive::close(const Uri& uri)
|
|||
m_real->close(uri);
|
||||
}
|
||||
|
||||
void AutobotInteractive::close(const UriQuery& uri)
|
||||
{
|
||||
m_real->close(uri);
|
||||
}
|
||||
|
||||
ValCh<Uri> AutobotInteractive::currentUri() const
|
||||
{
|
||||
return m_real->currentUri();
|
||||
|
|
|
@ -81,6 +81,7 @@ public:
|
|||
|
||||
void close(const std::string& uri) override;
|
||||
void close(const Uri& uri) override;
|
||||
void close(const UriQuery& uri) override;
|
||||
|
||||
ValCh<Uri> currentUri() const override;
|
||||
std::vector<Uri> stack() const override;
|
||||
|
|
|
@ -112,7 +112,7 @@
|
|||
<barAccidentalDistance>0.3</barAccidentalDistance>
|
||||
<multiMeasureRestMargin>1.2</multiMeasureRestMargin>
|
||||
<noteBarDistance>1</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<staffLineWidth>0.08</staffLineWidth>
|
||||
<ledgerLineWidth>0.12</ledgerLineWidth>
|
||||
<ledgerLineLength>0.38</ledgerLineLength>
|
||||
|
|
|
@ -112,7 +112,7 @@
|
|||
<barAccidentalDistance>0.3</barAccidentalDistance>
|
||||
<multiMeasureRestMargin>1.2</multiMeasureRestMargin>
|
||||
<noteBarDistance>1</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<staffLineWidth>0.08</staffLineWidth>
|
||||
<ledgerLineWidth>0.16</ledgerLineWidth>
|
||||
<ledgerLineLength>0.38</ledgerLineLength>
|
||||
|
|
|
@ -112,7 +112,7 @@
|
|||
<barAccidentalDistance>0.3</barAccidentalDistance>
|
||||
<multiMeasureRestMargin>1.2</multiMeasureRestMargin>
|
||||
<noteBarDistance>1</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<staffLineWidth>0.08</staffLineWidth>
|
||||
<ledgerLineWidth>0.16</ledgerLineWidth>
|
||||
<ledgerLineLength>0.38</ledgerLineLength>
|
||||
|
|
|
@ -125,7 +125,7 @@
|
|||
<barAccidentalDistance>0.65</barAccidentalDistance>
|
||||
<multiMeasureRestMargin>1.2</multiMeasureRestMargin>
|
||||
<noteBarDistance>1.5</noteBarDistance>
|
||||
<measureSpacing>1.2</measureSpacing>
|
||||
<measureSpacing>1.5</measureSpacing>
|
||||
<staffLineWidth>0.11</staffLineWidth>
|
||||
<ledgerLineWidth>0.16</ledgerLineWidth>
|
||||
<ledgerLineLength>0.35</ledgerLineLength>
|
||||
|
|
|
@ -104,9 +104,9 @@ System* LayoutSystem::collectSystem(const LayoutOptions& options, LayoutContext&
|
|||
// we need to recompute the layout of the previous measures. When updating the width of these
|
||||
// measures, curSysWidth must be updated accordingly.
|
||||
if (ctx.curMeasure->isMeasure()) {
|
||||
if (toMeasure(ctx.curMeasure)->computeTicks() < minTicks) {
|
||||
if (toMeasure(ctx.curMeasure)->shortestChordRest() < minTicks) {
|
||||
prevMinTicks = minTicks; // We save the previous value in case we need to restore it (see later)
|
||||
minTicks = toMeasure(ctx.curMeasure)->computeTicks();
|
||||
minTicks = toMeasure(ctx.curMeasure)->shortestChordRest();
|
||||
changeMinSysTicks = true;
|
||||
for (MeasureBase* mb : system->measures()) {
|
||||
if (mb == ctx.curMeasure) {
|
||||
|
@ -171,9 +171,10 @@ System* LayoutSystem::collectSystem(const LayoutOptions& options, LayoutContext&
|
|||
// check if lc.curMeasure fits, remove if not
|
||||
// collect at least one measure and the break
|
||||
|
||||
double acceptanceRange = system->isSqueezable() ? 1.025 : 1; // A value slightly larger than 1 allows systems
|
||||
// to be initially slightly larger than the target width and be justified by tightening rather than stretching.
|
||||
// However, we must first make sure that the system *can* be tightened. isSqueezable() checks for that.
|
||||
// acceptanceRange slightly larger than 1 allows systems to be initially slightly larger than the target width
|
||||
// and be justified by squeezing rather than stretching. However, we must first make sure that the system *can*
|
||||
// be squeezed. I'm temporarily rolling back the idea (still a bit too risky in some edge cases) [M.S.]
|
||||
double acceptanceRange = 1;
|
||||
bool doBreak = (system->measures().size() > 1) && ((curSysWidth + ww) > systemWidth * acceptanceRange);
|
||||
if (doBreak) {
|
||||
breakMeasure = ctx.curMeasure;
|
||||
|
|
|
@ -22,6 +22,10 @@
|
|||
#ifndef MU_ENGRAVING_LAYOUTSYSTEM_H
|
||||
#define MU_ENGRAVING_LAYOUTSYSTEM_H
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "libmscore/segment.h"
|
||||
|
||||
#include "layoutoptions.h"
|
||||
#include "layoutcontext.h"
|
||||
|
||||
|
|
|
@ -1011,7 +1011,7 @@ bool EngravingItem::readProperties(XmlReader& e)
|
|||
return true;
|
||||
}
|
||||
int id = e.readInt();
|
||||
_links = mu::value(e.linkIds(), id);
|
||||
_links = mu::value(e.linkIds(), id, nullptr);
|
||||
if (!_links) {
|
||||
if (!score()->isMaster()) { // DEBUG
|
||||
qDebug("---link %d not found (%d)", id, e.linkIds().size());
|
||||
|
|
|
@ -4030,16 +4030,10 @@ static bool hasAccidental(Segment* s)
|
|||
//---------------------------------------------------------
|
||||
float Measure::durationStretch(Fraction curTicks, const Fraction minTicks) const
|
||||
{
|
||||
qreal userSlope = userStretch() * score()->styleD(Sid::measureSpacing);
|
||||
static constexpr qreal baseSlope = 0.647;
|
||||
qreal slope = userSlope * baseSlope;
|
||||
// The slope of the spacing formula is determined by the multiplication of user-defined settings and baseSlope.
|
||||
// The value of baseSlope is chosen such that the curve matches the "ideal" one when user settings are at default.
|
||||
// See documentation PDF for more detail.
|
||||
qreal slope = score()->styleD(Sid::measureSpacing);
|
||||
|
||||
static constexpr int maxMMRestWidth = 20; // At most, MM rests will be spaced "as if" they were 20 bars long.
|
||||
static constexpr Fraction shortNoteThreshold = Fraction(1, 16);
|
||||
static constexpr Fraction longNoteThreshold = Fraction(1, 16);
|
||||
static double longNoteThreshold = Fraction(1, 16).ticks();
|
||||
|
||||
if (curTicks > m_timesig) { // This is the case of MM rests
|
||||
curTicks = curTicks - m_timesig; // A 2-bar MM rests receives the same space as one bar.
|
||||
|
@ -4048,12 +4042,22 @@ float Measure::durationStretch(Fraction curTicks, const Fraction minTicks) const
|
|||
}
|
||||
}
|
||||
|
||||
if (minTicks < shortNoteThreshold) {
|
||||
// Reduces the slope of the spacing curve in case very short notes are present.
|
||||
// Avoids having the longer notes too wide.
|
||||
qreal reduction = qMax((1 - 0.2 * log2(qreal(shortNoteThreshold.ticks()) / qreal(minTicks.ticks()))), 0.3);
|
||||
// The numbers (and the formula itself) are purely empirical.
|
||||
slope = slope * reduction;
|
||||
//------------------------------------------------------------------------
|
||||
// Prevent long notes from exploding in the presence of very short ones.
|
||||
// maxRatio defines the maximum accepted ratio between the longest and
|
||||
// shortest note of the system. If this ratio is exceeded, the subsequent
|
||||
// calculations ensure that the highest ratio is renormalized to maxRatio
|
||||
// and all other ratios are scaled accordingly.
|
||||
//------------------------------------------------------------------------
|
||||
static constexpr double maxRatio = 32.0;
|
||||
double minSysTicks = double(minTicks.ticks());
|
||||
double maxSysTicks = double(system()->maxSysTicks().ticks());
|
||||
double maxSysRatio = maxSysTicks / minSysTicks;
|
||||
double ratio = double(curTicks.ticks()) / minSysTicks;
|
||||
if (maxSysRatio > maxRatio) {
|
||||
double A = (minSysTicks * (maxRatio - 1)) / (maxSysTicks - minSysTicks);
|
||||
double B = (maxSysTicks - (maxRatio * minSysTicks)) / (maxSysTicks - minSysTicks);
|
||||
ratio = A * ratio + B;
|
||||
}
|
||||
|
||||
//TODO: choose formula in style settings
|
||||
|
@ -4062,13 +4066,15 @@ float Measure::durationStretch(Fraction curTicks, const Fraction minTicks) const
|
|||
// Logarithmic spacing (MS 3.6)
|
||||
//qreal str = 1.0 + 0.721 * slope * log(qreal(curTicks.ticks()) / qreal(minTicks.ticks()));
|
||||
// Quadratic spacing
|
||||
qreal str = 1 - slope + slope * sqrt(qreal(curTicks.ticks()) / qreal(minTicks.ticks()));
|
||||
// qreal str = 1 - slope + slope * sqrt(ratio);
|
||||
// Custom spacing
|
||||
double str = pow(slope, log2(ratio));
|
||||
|
||||
if (minTicks > longNoteThreshold) {
|
||||
// Avoids long notes being too narrow in the absense of shorter notes.
|
||||
str = str * (1 - 0.5 + 0.5 * sqrt(qreal(minTicks.ticks()) / qreal(longNoteThreshold.ticks())));
|
||||
// This is equivalent to assuming that a 1/16 note is present and spacing longer notes according to it.
|
||||
// The 0.5 factor is purely empirical.
|
||||
// Prevents long notes from being too narrow in the absence of shorter ones. The
|
||||
// numeric factor and the formula itself are purely empirical. They "look good".
|
||||
if (minSysTicks > longNoteThreshold) {
|
||||
double empFactor = 0.6;
|
||||
str = str * (1 - empFactor + empFactor * sqrt(minSysTicks / longNoteThreshold));
|
||||
}
|
||||
|
||||
return str;
|
||||
|
@ -4092,12 +4098,10 @@ void Measure::computeWidth(Segment* s, qreal x, bool isSystemHeader, Fraction mi
|
|||
bool first = isFirstInSystem();
|
||||
const Shape ls(first ? RectF(0.0, -1000000.0, 0.0, 2000000.0) : RectF(0.0, 0.0, 0.0, spatium() * 4));
|
||||
|
||||
qreal minNoteSpace = score()->noteHeadWidth() * 1.05; // This used to be minNoteSpace = noteHeadWidth() + minNoteDistance().
|
||||
// I have removed minNoteDistance() because it was causing an unintuitive behaviour in the spacing,
|
||||
// and I've substituted it with a purely empirical factor (*1.05) which obtains a similar default distance.
|
||||
qreal usrStretch = userStretch() * score()->styleD(Sid::measureSpacing); // This is 1.2 by program default settings
|
||||
usrStretch = std::max(usrStretch, qreal(0.1)); // Avoids stretch going to zero
|
||||
qreal minNoteSpace = score()->noteHeadWidth() + score()->styleMM(Sid::minNoteDistance);
|
||||
qreal usrStretch = std::max(userStretch(), qreal(0.1)); // Avoids stretch going to zero
|
||||
usrStretch = std::min(usrStretch, qreal(10)); // Higher values may cause the spacing to break (10 is already ridiculously high and no user should even use that)
|
||||
qreal durStretch = 1;
|
||||
|
||||
while (s) {
|
||||
s->rxpos() = x;
|
||||
|
@ -4111,6 +4115,7 @@ void Measure::computeWidth(Segment* s, qreal x, bool isSystemHeader, Fraction mi
|
|||
s = s->next();
|
||||
continue;
|
||||
}
|
||||
|
||||
Segment* ns = s->nextActive();
|
||||
while (ns && ns->allElementsInvisible()) {
|
||||
ns = ns->nextActive();
|
||||
|
@ -4120,8 +4125,15 @@ void Measure::computeWidth(Segment* s, qreal x, bool isSystemHeader, Fraction mi
|
|||
if (!ns) {
|
||||
ns = s->next(SegmentType::BarLineType);
|
||||
}
|
||||
|
||||
Segment* ps = s->prevActive();
|
||||
|
||||
qreal w;
|
||||
|
||||
bool hasAdjacent = (s->isChordRestType() && s->shortestChordRest() == s->ticks());
|
||||
// The actual duration of a segment, i.e. ticks(), can be shorter than its shortest note if
|
||||
// another voice comes in. In such case, hasAdjacent = false. This info is key to correct spacing.
|
||||
|
||||
if (ns) {
|
||||
if (isSystemHeader && (ns->isChordRestType() || (ns->isClefType() && !ns->header()))) {
|
||||
// this is the system header gap
|
||||
|
@ -4132,8 +4144,17 @@ void Measure::computeWidth(Segment* s, qreal x, bool isSystemHeader, Fraction mi
|
|||
// New spacing algorithm: we apply an additional spacing which depends on the duration of
|
||||
// the note with respect to the shortest note *of the system*.
|
||||
if (s->isChordRestType()) {
|
||||
Fraction t = s->ticks();
|
||||
qreal durStretch = durationStretch(t, minTicks);
|
||||
if (hasAdjacent || isMMRest()) { // Normal segments
|
||||
durStretch = durationStretch(s->ticks(), minTicks);
|
||||
} else { // The following calculations are key to correct spacing of polyrythms
|
||||
Fraction curTicks = s->shortestChordRest();
|
||||
Fraction prevTicks = ps ? ps->shortestChordRest() : Fraction(0, 1);
|
||||
if (ps && prevTicks <= curTicks) {
|
||||
durStretch = durationStretch(prevTicks, minTicks) * (double(s->ticks().ticks()) / double(prevTicks.ticks()));
|
||||
} else if (ps && prevTicks > curTicks) {
|
||||
durStretch = durationStretch(curTicks, minTicks) * (double(s->ticks().ticks()) / double(curTicks.ticks()));
|
||||
}
|
||||
}
|
||||
qreal minStretchedWidth = minNoteSpace * durStretch * usrStretch * stretchCoeff;
|
||||
// NOTE: durStretch is the spacing factor purely determined by the duration of the note.
|
||||
// usrStretch is the spacing factor determined by user settings.
|
||||
|
@ -4520,4 +4541,34 @@ void Measure::stretchMeasureInPracticeMode(qreal targetWidth)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
Fraction Measure::maxTicks() const
|
||||
{
|
||||
Segment* s = first();
|
||||
Fraction maxticks = Fraction(0, 1);
|
||||
while (s) {
|
||||
if (s->enabled()) {
|
||||
maxticks = std::max(maxticks, s->ticks());
|
||||
}
|
||||
s = s->next();
|
||||
}
|
||||
return maxticks;
|
||||
}
|
||||
|
||||
Fraction Measure::shortestChordRest() const
|
||||
{
|
||||
Fraction shortest = Fraction::max(); // Initializing at arbitrary high value
|
||||
Fraction cur = Fraction::max();
|
||||
Segment* s = first();
|
||||
while (s) {
|
||||
if (s->isChordRestType() && !s->allElementsInvisible()) {
|
||||
cur = s->shortestChordRest();
|
||||
if (cur < shortest) {
|
||||
shortest = cur;
|
||||
}
|
||||
}
|
||||
s = s->next();
|
||||
}
|
||||
return shortest;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -215,6 +215,8 @@ public:
|
|||
|
||||
void layoutMeasureElements();
|
||||
Fraction computeTicks();
|
||||
Fraction shortestChordRest() const;
|
||||
Fraction maxTicks() const;
|
||||
void layout2();
|
||||
|
||||
bool showsMeasureNumber();
|
||||
|
|
|
@ -39,7 +39,7 @@ int PitchList::pitchOffset(int tick) const
|
|||
|
||||
std::vector<int> ticks = mu::keys(*this);
|
||||
auto it = std::upper_bound(ticks.cbegin(), ticks.cend(), tick);
|
||||
if (it == ticks.cend()) {
|
||||
if (it == ticks.cbegin()) {
|
||||
return 0;
|
||||
}
|
||||
--it;
|
||||
|
|
|
@ -36,7 +36,7 @@ class PitchList : public std::map<int, int>
|
|||
public:
|
||||
PitchList() {}
|
||||
int pitchOffset(int tick) const;
|
||||
void setPitchOffset(int tick, int offset) { insert({ tick, offset }); }
|
||||
void setPitchOffset(int tick, int offset) { insert_or_assign(tick, offset); }
|
||||
};
|
||||
} // namespace Ms
|
||||
#endif
|
||||
|
|
|
@ -654,7 +654,16 @@ void Score::rebuildTempoAndTimeSigMaps(Measure* measure)
|
|||
BeatsPerSecond otempo = tempomap()->tempo(segment.tick().ticks());
|
||||
BeatsPerSecond ntempo = otempo.val / stretch;
|
||||
tempomap()->setTempo(segment.tick().ticks(), ntempo);
|
||||
Fraction etick = segment.tick() + segment.ticks() - Fraction(1, 480 * 4);
|
||||
|
||||
Fraction currentSegmentEndTick;
|
||||
|
||||
if (segment.next1()) {
|
||||
currentSegmentEndTick = segment.next1()->tick();
|
||||
} else {
|
||||
currentSegmentEndTick = segment.tick() + segment.ticks();
|
||||
}
|
||||
|
||||
Fraction etick = currentSegmentEndTick - Fraction(1, 480 * 4);
|
||||
auto e = tempomap()->find(etick.ticks());
|
||||
if (e == tempomap()->end()) {
|
||||
tempomap()->setTempo(etick.ticks(), otempo);
|
||||
|
@ -2040,7 +2049,7 @@ QString Score::metaTag(const QString& s) const
|
|||
|
||||
void Score::setMetaTag(const QString& tag, const QString& val)
|
||||
{
|
||||
_metaTags.insert({ tag, val });
|
||||
_metaTags.insert_or_assign(tag, val);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
|
|
|
@ -2691,4 +2691,27 @@ qreal Segment::minHorizontalDistance(Segment* ns, bool systemHeaderGap) const
|
|||
}
|
||||
return w;
|
||||
}
|
||||
|
||||
//------------------------------------------------------
|
||||
// shortestChordRest()
|
||||
// returns the shortest chordRest of a segment. IMPORTANT:
|
||||
// this is not the same as the ticks() of the segment. The
|
||||
// actual duration of the segment may be shorter than its
|
||||
// shortest chordRest.
|
||||
//------------------------------------------------------
|
||||
Fraction Segment::shortestChordRest() const
|
||||
{
|
||||
Fraction shortest = Fraction::max(); // Initializing at arbitrary high value
|
||||
Fraction cur = Fraction::max();
|
||||
for (auto elem : elist()) {
|
||||
if (!elem || !elem->staff()->show() || !elem->isChordRest()) {
|
||||
continue;
|
||||
}
|
||||
cur = toChordRest(elem)->actualTicks();
|
||||
if (cur < shortest) {
|
||||
shortest = cur;
|
||||
}
|
||||
}
|
||||
return shortest;
|
||||
}
|
||||
} // namespace Ms
|
||||
|
|
|
@ -289,6 +289,8 @@ public:
|
|||
bool isTimeSigAnnounceType() const { return _segmentType == SegmentType::TimeSigAnnounce; }
|
||||
bool isMMRestSegment() const;
|
||||
|
||||
Fraction shortestChordRest() const;
|
||||
|
||||
static constexpr SegmentType durationSegmentsMask = SegmentType::ChordRest; // segment types which may have non-zero tick length
|
||||
};
|
||||
|
||||
|
|
|
@ -1015,8 +1015,8 @@ SwingParameters Staff::swing(const Fraction& tick) const
|
|||
}
|
||||
|
||||
std::vector<int> ticks = mu::keys(_swingList);
|
||||
auto it = std::upper_bound(ticks.begin(), ticks.end(), tick.ticks());
|
||||
if (it == ticks.begin()) {
|
||||
auto it = std::upper_bound(ticks.cbegin(), ticks.cend(), tick.ticks());
|
||||
if (it == ticks.cbegin()) {
|
||||
return sp;
|
||||
}
|
||||
--it;
|
||||
|
@ -1034,8 +1034,8 @@ int Staff::capo(const Fraction& tick) const
|
|||
}
|
||||
|
||||
std::vector<int> ticks = mu::keys(_capoList);
|
||||
auto it = std::upper_bound(ticks.begin(), ticks.end(), tick.ticks());
|
||||
if (it == ticks.begin()) {
|
||||
auto it = std::upper_bound(ticks.cbegin(), ticks.cend(), tick.ticks());
|
||||
if (it == ticks.cbegin()) {
|
||||
return 0;
|
||||
}
|
||||
--it;
|
||||
|
@ -1094,8 +1094,8 @@ int Staff::channel(const Fraction& tick, int voice) const
|
|||
}
|
||||
|
||||
std::vector<int> ticks = mu::keys(_channelList[voice]);
|
||||
auto it = std::upper_bound(ticks.begin(), ticks.end(), tick.ticks());
|
||||
if (it == ticks.begin()) {
|
||||
auto it = std::upper_bound(ticks.cbegin(), ticks.cend(), tick.ticks());
|
||||
if (it == ticks.cbegin()) {
|
||||
return 0;
|
||||
}
|
||||
--it;
|
||||
|
|
|
@ -1945,7 +1945,7 @@ Fraction System::minSysTicks() const
|
|||
for (MeasureBase* mb : measures()) {
|
||||
if (mb->isMeasure()) {
|
||||
Measure* m = toMeasure(mb);
|
||||
minTicks = std::min(m->computeTicks(), minTicks);
|
||||
minTicks = std::min(m->shortestChordRest(), minTicks);
|
||||
}
|
||||
}
|
||||
return minTicks;
|
||||
|
@ -1982,4 +1982,15 @@ bool System::isSqueezable() const
|
|||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Fraction System::maxSysTicks() const
|
||||
{
|
||||
Fraction maxTicks = Fraction(0, 1);
|
||||
for (auto mb : measures()) {
|
||||
if (mb->isMeasure()) {
|
||||
maxTicks = std::max(maxTicks, toMeasure(mb)->maxTicks());
|
||||
}
|
||||
}
|
||||
return maxTicks;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -237,6 +237,7 @@ public:
|
|||
int lastVisibleSysStaffOfPart(const Part* part) const;
|
||||
|
||||
Fraction minSysTicks() const;
|
||||
Fraction maxSysTicks() const;
|
||||
|
||||
bool isSqueezable() const;
|
||||
};
|
||||
|
|
|
@ -3096,9 +3096,7 @@ Score::FileError Read114::read114(MasterScore* masterScore, XmlReader& e, ReadCo
|
|||
masterScore->style().set(Sid::minEmptyMeasures, 1);
|
||||
}
|
||||
masterScore->style().set(Sid::frameSystemDistance, masterScore->styleS(Sid::frameSystemDistance) + Spatium(6.0));
|
||||
// hack: net overall effect of layout changes has been for things to take slightly more room
|
||||
qreal adjustedSpacing = qMax(masterScore->styleD(Sid::measureSpacing) * 0.95, 1.0);
|
||||
masterScore->style().set(Sid::measureSpacing, adjustedSpacing);
|
||||
masterScore->resetStyleValue(Sid::measureSpacing);
|
||||
|
||||
// add invisible tempo text if necessary
|
||||
// some 1.3 scores have tempolist but no tempo text
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
*/
|
||||
|
||||
#include "writecontext.h"
|
||||
#include "containers.h"
|
||||
|
||||
using namespace mu::engraving;
|
||||
|
||||
|
@ -36,5 +37,5 @@ void WriteContext::setLidLocalIndex(int lid, int localIndex)
|
|||
|
||||
int WriteContext::lidLocalIndex(int lid) const
|
||||
{
|
||||
return m_lidLocalIndices.at(lid);
|
||||
return mu::value(m_lidLocalIndices, lid, 0);
|
||||
}
|
||||
|
|
|
@ -194,7 +194,7 @@ const std::array<StyleDef::StyleValue, size_t(Sid::STYLES)> StyleDef::styleValue
|
|||
|
||||
{ Sid::barAccidentalDistance, "barAccidentalDistance", Spatium(0.65) },
|
||||
{ Sid::noteBarDistance, "noteBarDistance", Spatium(1.5) },
|
||||
{ Sid::measureSpacing, "measureSpacing", 1.2 },
|
||||
{ Sid::measureSpacing, "measureSpacing", 1.5 },
|
||||
{ Sid::measureRepeatNumberPos, "measureRepeatNumberPos", Spatium(-0.5) },
|
||||
{ Sid::mrNumberSeries, "mrNumberSeries", false },
|
||||
{ Sid::mrNumberEveryXMeasures, "mrNumberEveryXMeasures", 4 },
|
||||
|
|
|
@ -387,7 +387,7 @@
|
|||
<voice>
|
||||
<Beam>
|
||||
<l1>-16</l1>
|
||||
<l2>-10</l2>
|
||||
<l2>-12</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
<durationType>eighth</durationType>
|
||||
|
@ -406,7 +406,7 @@
|
|||
<Beam>
|
||||
<StemDirection>up</StemDirection>
|
||||
<l1>-16</l1>
|
||||
<l2>-10</l2>
|
||||
<l2>-12</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
<BeamMode>begin</BeamMode>
|
||||
|
@ -426,7 +426,7 @@
|
|||
<Beam>
|
||||
<StemDirection>up</StemDirection>
|
||||
<l1>-16</l1>
|
||||
<l2>-10</l2>
|
||||
<l2>-12</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
<durationType>eighth</durationType>
|
||||
|
@ -791,8 +791,8 @@
|
|||
</Chord>
|
||||
<Beam>
|
||||
<StemDirection>down</StemDirection>
|
||||
<l1>32</l1>
|
||||
<l2>38</l2>
|
||||
<l1>38</l1>
|
||||
<l2>40</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
<durationType>eighth</durationType>
|
||||
|
@ -834,7 +834,7 @@
|
|||
<voice>
|
||||
<Beam>
|
||||
<StemDirection>down</StemDirection>
|
||||
<l1>38</l1>
|
||||
<l1>40</l1>
|
||||
<l2>44</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
@ -852,7 +852,7 @@
|
|||
</Note>
|
||||
</Chord>
|
||||
<Beam>
|
||||
<l1>42</l1>
|
||||
<l1>44</l1>
|
||||
<l2>48</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
@ -872,7 +872,7 @@
|
|||
</Chord>
|
||||
<Beam>
|
||||
<StemDirection>down</StemDirection>
|
||||
<l1>46</l1>
|
||||
<l1>48</l1>
|
||||
<l2>52</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
|
|
@ -388,7 +388,7 @@
|
|||
<Beam>
|
||||
<StemDirection>up</StemDirection>
|
||||
<l1>-20</l1>
|
||||
<l2>-14</l2>
|
||||
<l2>-16</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
<durationType>eighth</durationType>
|
||||
|
@ -407,7 +407,7 @@
|
|||
<Beam>
|
||||
<StemDirection>up</StemDirection>
|
||||
<l1>-20</l1>
|
||||
<l2>-14</l2>
|
||||
<l2>-16</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
<BeamMode>begin</BeamMode>
|
||||
|
@ -427,7 +427,7 @@
|
|||
<Beam>
|
||||
<StemDirection>up</StemDirection>
|
||||
<l1>-20</l1>
|
||||
<l2>-14</l2>
|
||||
<l2>-16</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
<durationType>eighth</durationType>
|
||||
|
@ -811,8 +811,8 @@
|
|||
</Chord>
|
||||
<Beam>
|
||||
<StemDirection>down</StemDirection>
|
||||
<l1>32</l1>
|
||||
<l2>38</l2>
|
||||
<l1>38</l1>
|
||||
<l2>40</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
<BeamMode>begin</BeamMode>
|
||||
|
@ -853,7 +853,7 @@
|
|||
</Note>
|
||||
</Chord>
|
||||
<Beam>
|
||||
<l1>38</l1>
|
||||
<l1>40</l1>
|
||||
<l2>44</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
@ -873,7 +873,7 @@
|
|||
</Chord>
|
||||
<Beam>
|
||||
<StemDirection>down</StemDirection>
|
||||
<l1>42</l1>
|
||||
<l1>44</l1>
|
||||
<l2>48</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
|
|
@ -807,8 +807,8 @@
|
|||
<voice>
|
||||
<Beam>
|
||||
<StemDirection>down</StemDirection>
|
||||
<l1>32</l1>
|
||||
<l2>38</l2>
|
||||
<l1>38</l1>
|
||||
<l2>40</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
<durationType>eighth</durationType>
|
||||
|
@ -845,7 +845,7 @@
|
|||
</Chord>
|
||||
<Beam>
|
||||
<StemDirection>down</StemDirection>
|
||||
<l1>38</l1>
|
||||
<l1>40</l1>
|
||||
<l2>44</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
|
|
@ -525,7 +525,7 @@
|
|||
<durationType>quarter</durationType>
|
||||
</Rest>
|
||||
<Beam>
|
||||
<l1>42</l1>
|
||||
<l1>38</l1>
|
||||
<l2>44</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
@ -1159,7 +1159,7 @@
|
|||
<durationType>quarter</durationType>
|
||||
</Rest>
|
||||
<Beam>
|
||||
<l1>42</l1>
|
||||
<l1>38</l1>
|
||||
<l2>44</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
|
|
@ -520,7 +520,7 @@
|
|||
<durationType>eighth</durationType>
|
||||
</Rest>
|
||||
<Beam>
|
||||
<l1>42</l1>
|
||||
<l1>38</l1>
|
||||
<l2>44</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
@ -1135,7 +1135,7 @@
|
|||
<durationType>eighth</durationType>
|
||||
</Rest>
|
||||
<Beam>
|
||||
<l1>42</l1>
|
||||
<l1>38</l1>
|
||||
<l2>44</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
|
|
@ -483,7 +483,7 @@
|
|||
</Note>
|
||||
</Chord>
|
||||
<Beam>
|
||||
<l1>100</l1>
|
||||
<l1>102</l1>
|
||||
<l2>104</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
@ -525,7 +525,7 @@
|
|||
</Chord>
|
||||
<Beam>
|
||||
<l1>100</l1>
|
||||
<l2>96</l2>
|
||||
<l2>98</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
<durationType>eighth</durationType>
|
||||
|
@ -1154,7 +1154,7 @@
|
|||
</Note>
|
||||
</Chord>
|
||||
<Beam>
|
||||
<l1>-6</l1>
|
||||
<l1>-8</l1>
|
||||
<l2>-10</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
|
|
@ -739,7 +739,7 @@
|
|||
</Note>
|
||||
</Chord>
|
||||
<Beam>
|
||||
<l1>-6</l1>
|
||||
<l1>-8</l1>
|
||||
<l2>-10</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
|
|
@ -145,6 +145,11 @@ struct AudioFxParams {
|
|||
&& configuration == other.configuration;
|
||||
}
|
||||
|
||||
bool operator !=(const AudioFxParams& other) const
|
||||
{
|
||||
return !(*this == other);
|
||||
}
|
||||
|
||||
bool operator<(const AudioFxParams& other) const
|
||||
{
|
||||
return resourceMeta < other.resourceMeta
|
||||
|
@ -164,15 +169,13 @@ struct AudioOutputParams {
|
|||
volume_db_t volume = 0.f;
|
||||
balance_t balance = 0.f;
|
||||
bool muted = false;
|
||||
bool solo = false;
|
||||
|
||||
bool operator ==(const AudioOutputParams& other) const
|
||||
{
|
||||
return fxChain == other.fxChain
|
||||
&& volume == other.volume
|
||||
&& balance == other.balance
|
||||
&& muted == other.muted
|
||||
&& solo == other.solo;
|
||||
&& muted == other.muted;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ using namespace mu::audio;
|
|||
using namespace mu::audio::synth;
|
||||
using namespace mu::mpe;
|
||||
|
||||
static constexpr double FLUID_GLOBAL_VOLUME_GAIN = 8.0;
|
||||
static constexpr double FLUID_GLOBAL_VOLUME_GAIN = 4.8;
|
||||
static constexpr int DEFAULT_MIDI_VOLUME = 100;
|
||||
|
||||
static std::vector<double> FLUID_STANDARD_TUNING(12, -150.0);
|
||||
|
|
|
@ -106,7 +106,7 @@ bool MixerChannel::isActive() const
|
|||
{
|
||||
ONLY_AUDIO_WORKER_THREAD;
|
||||
|
||||
return m_params.muted;
|
||||
return !m_params.muted;
|
||||
}
|
||||
|
||||
void MixerChannel::setIsActive(bool arg)
|
||||
|
|
|
@ -168,6 +168,7 @@ public:
|
|||
|
||||
virtual void close(const std::string& uri) = 0;
|
||||
virtual void close(const Uri& uri) = 0;
|
||||
virtual void close(const UriQuery& uri) = 0;
|
||||
|
||||
virtual ValCh<Uri> currentUri() const = 0;
|
||||
virtual std::vector<Uri> stack() const = 0;
|
||||
|
|
|
@ -214,6 +214,11 @@ void Interactive::close(const Uri& uri)
|
|||
provider()->close(uri);
|
||||
}
|
||||
|
||||
void Interactive::close(const UriQuery& uri)
|
||||
{
|
||||
provider()->close(uri);
|
||||
}
|
||||
|
||||
ValCh<Uri> Interactive::currentUri() const
|
||||
{
|
||||
return provider()->currentUri();
|
||||
|
|
|
@ -81,6 +81,7 @@ public:
|
|||
|
||||
void close(const std::string& uri) override;
|
||||
void close(const Uri& uri) override;
|
||||
void close(const UriQuery& uri) override;
|
||||
|
||||
ValCh<Uri> currentUri() const override;
|
||||
std::vector<Uri> stack() const override;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -63,6 +63,7 @@ public:
|
|||
virtual void raise(const UriQuery& uri) = 0;
|
||||
|
||||
virtual void close(const Uri& uri) = 0;
|
||||
virtual void close(const UriQuery& uri) = 0;
|
||||
|
||||
virtual ValCh<Uri> currentUri() const = 0;
|
||||
virtual std::vector<Uri> stack() const = 0;
|
||||
|
|
|
@ -213,28 +213,40 @@ void InteractiveProvider::raise(const UriQuery& uri)
|
|||
|
||||
void InteractiveProvider::close(const Uri& uri)
|
||||
{
|
||||
for (const ObjectInfo& objectInfo : m_stack) {
|
||||
if (objectInfo.uriQuery.uri() != uri) {
|
||||
continue;
|
||||
for (const ObjectInfo& obj : m_stack) {
|
||||
if (obj.uriQuery.uri() == uri) {
|
||||
closeObject(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ContainerMeta openMeta = uriRegister()->meta(objectInfo.uriQuery.uri());
|
||||
switch (openMeta.type) {
|
||||
case ContainerType::QWidgetDialog: {
|
||||
if (auto window = dynamic_cast<QWidget*>(objectInfo.window)) {
|
||||
window->close();
|
||||
}
|
||||
} break;
|
||||
case ContainerType::QmlDialog:
|
||||
closeQml(objectInfo.objectId);
|
||||
break;
|
||||
case ContainerType::PrimaryPage:
|
||||
case ContainerType::Undefined:
|
||||
break;
|
||||
void InteractiveProvider::close(const UriQuery& uri)
|
||||
{
|
||||
for (const ObjectInfo& obj : m_stack) {
|
||||
if (obj.uriQuery == uri) {
|
||||
closeObject(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void InteractiveProvider::closeObject(const ObjectInfo& obj)
|
||||
{
|
||||
ContainerMeta openMeta = uriRegister()->meta(obj.uriQuery.uri());
|
||||
switch (openMeta.type) {
|
||||
case ContainerType::QWidgetDialog: {
|
||||
if (auto window = dynamic_cast<QWidget*>(obj.window)) {
|
||||
window->close();
|
||||
}
|
||||
} break;
|
||||
case ContainerType::QmlDialog:
|
||||
closeQml(obj.objectId);
|
||||
break;
|
||||
case ContainerType::PrimaryPage:
|
||||
case ContainerType::Undefined:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void InteractiveProvider::fillData(QmlLaunchData* data, const UriQuery& q) const
|
||||
{
|
||||
ContainerMeta meta = uriRegister()->meta(q.uri());
|
||||
|
|
|
@ -80,6 +80,7 @@ public:
|
|||
void raise(const UriQuery& uri) override;
|
||||
|
||||
void close(const Uri& uri) override;
|
||||
void close(const UriQuery& uri) override;
|
||||
|
||||
ValCh<Uri> currentUri() const override;
|
||||
std::vector<Uri> stack() const override;
|
||||
|
@ -131,6 +132,8 @@ private:
|
|||
int defBtn = int(framework::IInteractive::Button::NoButton),
|
||||
const framework::IInteractive::Options& options = {});
|
||||
|
||||
void closeObject(const ObjectInfo& obj);
|
||||
|
||||
void closeQml(const QVariant& objectId);
|
||||
void raiseQml(const QVariant& objectId);
|
||||
|
||||
|
|
|
@ -174,7 +174,8 @@ void PopupView::open()
|
|||
m_window->setResizable(m_resizable);
|
||||
}
|
||||
|
||||
m_window->show(m_globalPos.toPoint(), m_openPolicy != OpenPolicy::NoActivateFocus);
|
||||
QScreen* screen = resolveScreen();
|
||||
m_window->show(screen, m_globalPos.toPoint(), m_openPolicy != OpenPolicy::NoActivateFocus);
|
||||
|
||||
m_globalPos = QPointF(); // invalidate
|
||||
|
||||
|
@ -569,14 +570,23 @@ void PopupView::setErrCode(Ret::Code code)
|
|||
setRet(ret);
|
||||
}
|
||||
|
||||
QRect PopupView::currentScreenGeometry() const
|
||||
QScreen* PopupView::resolveScreen() const
|
||||
{
|
||||
QScreen* currentScreen = mainWindow()->screen();
|
||||
if (!currentScreen) {
|
||||
currentScreen = QGuiApplication::primaryScreen();
|
||||
const QQuickItem* parent = parentItem();
|
||||
const QWindow* parentWindow = parent ? parent->window() : nullptr;
|
||||
QScreen* screen = parentWindow ? parentWindow->screen() : nullptr;
|
||||
|
||||
if (!screen) {
|
||||
screen = QGuiApplication::primaryScreen();
|
||||
}
|
||||
|
||||
return mainWindow()->isFullScreen() ? currentScreen->geometry() : currentScreen->availableGeometry();
|
||||
return screen;
|
||||
}
|
||||
|
||||
QRect PopupView::currentScreenGeometry() const
|
||||
{
|
||||
QScreen* screen = resolveScreen();
|
||||
return mainWindow()->isFullScreen() ? screen->geometry() : screen->availableGeometry();
|
||||
}
|
||||
|
||||
void PopupView::updatePosition()
|
||||
|
@ -592,11 +602,6 @@ void PopupView::updatePosition()
|
|||
m_globalPos = parentTopLeft + m_localPos;
|
||||
}
|
||||
|
||||
const QWindow* window = mainWindow()->qWindow();
|
||||
if (!window) {
|
||||
return;
|
||||
}
|
||||
|
||||
QRectF anchorRect = anchorGeometry();
|
||||
QRectF popupRect(m_globalPos, QSize(contentWidth(), contentHeight() + padding() * 2));
|
||||
|
||||
|
|
|
@ -218,6 +218,7 @@ protected:
|
|||
|
||||
void setErrCode(Ret::Code code);
|
||||
|
||||
QScreen* resolveScreen() const;
|
||||
QRect currentScreenGeometry() const;
|
||||
void updatePosition();
|
||||
void updateContentPosition();
|
||||
|
|
|
@ -42,10 +42,10 @@ public:
|
|||
|
||||
virtual void setContent(QQuickItem* item) = 0;
|
||||
|
||||
virtual void show(QPoint p, bool activateFocus) = 0;
|
||||
virtual void show(QScreen* screen, QPoint position, bool activateFocus) = 0;
|
||||
virtual void close() = 0;
|
||||
virtual void raise() = 0;
|
||||
virtual void setPosition(QPoint p) = 0;
|
||||
virtual void setPosition(QPoint position) = 0;
|
||||
|
||||
virtual QWindow* qWindow() const = 0;
|
||||
virtual bool isVisible() const = 0;
|
||||
|
|
|
@ -106,10 +106,10 @@ void PopupWindow_QQuickView::forceActiveFocus()
|
|||
}
|
||||
}
|
||||
|
||||
void PopupWindow_QQuickView::show(QPoint p, bool activateFocus)
|
||||
void PopupWindow_QQuickView::show(QScreen* screen, QPoint position, bool activateFocus)
|
||||
{
|
||||
m_view->setPosition(p);
|
||||
m_view->setScreen(mainWindow()->screen());
|
||||
m_view->setPosition(position);
|
||||
m_view->setScreen(screen);
|
||||
|
||||
m_activeFocusOnParentOnClose = activateFocus;
|
||||
|
||||
|
@ -146,9 +146,9 @@ void PopupWindow_QQuickView::raise()
|
|||
m_view->raise();
|
||||
}
|
||||
|
||||
void PopupWindow_QQuickView::setPosition(QPoint p)
|
||||
void PopupWindow_QQuickView::setPosition(QPoint position)
|
||||
{
|
||||
m_view->setPosition(p);
|
||||
m_view->setPosition(position);
|
||||
}
|
||||
|
||||
QWindow* PopupWindow_QQuickView::qWindow() const
|
||||
|
|
|
@ -46,10 +46,10 @@ public:
|
|||
|
||||
void setContent(QQuickItem* item) override;
|
||||
|
||||
void show(QPoint p, bool activateFocus) override;
|
||||
void show(QScreen* screen, QPoint position, bool activateFocus) override;
|
||||
void close() override;
|
||||
void raise() override;
|
||||
void setPosition(QPoint p) override;
|
||||
void setPosition(QPoint position) override;
|
||||
|
||||
QWindow* qWindow() const override;
|
||||
bool isVisible() const override;
|
||||
|
|
|
@ -28,12 +28,6 @@ using namespace mu::vst;
|
|||
using namespace mu::audio;
|
||||
using namespace mu::audio::fx;
|
||||
|
||||
bool filterFxParams(const std::pair<AudioFxChainOrder, AudioFxParams>& f,
|
||||
const std::pair<AudioFxChainOrder, AudioFxParams>& s)
|
||||
{
|
||||
return (f.first == s.first) && !(f.second == s.second);
|
||||
}
|
||||
|
||||
std::vector<IFxProcessorPtr> VstFxResolver::resolveFxList(const audio::TrackId trackId, const AudioFxChain& fxChain)
|
||||
{
|
||||
if (fxChain.empty()) {
|
||||
|
@ -92,6 +86,8 @@ VstFxPtr VstFxResolver::createMasterFx(const audio::AudioFxParams& fxParams) con
|
|||
VstPluginPtr pluginPtr = std::make_shared<VstPlugin>(modulePtr);
|
||||
pluginsRegister()->registerMasterFxPlugin(fxParams.resourceMeta.id, fxParams.chainOrder, pluginPtr);
|
||||
|
||||
pluginPtr->load();
|
||||
|
||||
std::shared_ptr<VstFxProcessor> fx = std::make_shared<VstFxProcessor>(std::move(pluginPtr), fxParams);
|
||||
fx->init();
|
||||
|
||||
|
@ -128,21 +124,18 @@ void VstFxResolver::updateTrackFxMap(FxMap& fxMap, const audio::TrackId trackId,
|
|||
}
|
||||
|
||||
audio::AudioFxChain fxToRemove;
|
||||
fxChainToRemove(newFxChain, currentFxChain, fxToRemove);
|
||||
fxChainToRemove(currentFxChain, newFxChain, fxToRemove);
|
||||
|
||||
for (const auto& pair : fxToRemove) {
|
||||
pluginsRegister()->unregisterFxPlugin(trackId, pair.second.resourceMeta.id, pair.second.chainOrder);
|
||||
fxMap.erase(pair.second.chainOrder);
|
||||
currentFxChain.erase(pair.first);
|
||||
fxMap.erase(pair.first);
|
||||
}
|
||||
|
||||
audio::AudioFxChain fxToCreate;
|
||||
fxChainToCreate(newFxChain, currentFxChain, fxToCreate);
|
||||
fxChainToCreate(currentFxChain, newFxChain, fxToCreate);
|
||||
|
||||
for (const auto& pair : fxToCreate) {
|
||||
if (!pair.second.isValid()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
VstFxPtr fxPtr = createTrackFx(trackId, pair.second);
|
||||
|
||||
if (fxPtr) {
|
||||
|
@ -159,20 +152,18 @@ void VstFxResolver::updateMasterFxMap(const AudioFxChain& newFxChain)
|
|||
}
|
||||
|
||||
audio::AudioFxChain fxToRemove;
|
||||
fxChainToRemove(newFxChain, currentFxChain, fxToRemove);
|
||||
fxChainToRemove(currentFxChain, newFxChain, fxToRemove);
|
||||
|
||||
for (const auto& pair : fxToRemove) {
|
||||
pluginsRegister()->unregisterMasterFxPlugin(pair.second.resourceMeta.id, pair.second.chainOrder);
|
||||
m_masterFxMap.erase(pair.second.chainOrder);
|
||||
currentFxChain.erase(pair.first);
|
||||
m_masterFxMap.erase(pair.first);
|
||||
}
|
||||
|
||||
audio::AudioFxChain fxToCreate;
|
||||
fxChainToCreate(newFxChain, currentFxChain, fxToCreate);
|
||||
fxChainToCreate(currentFxChain, newFxChain, fxToCreate);
|
||||
|
||||
for (const auto& pair : fxToCreate) {
|
||||
if (!pair.second.isValid()) {
|
||||
continue;
|
||||
}
|
||||
m_masterFxMap.emplace(pair.first, createMasterFx(pair.second));
|
||||
}
|
||||
}
|
||||
|
@ -181,18 +172,31 @@ void VstFxResolver::fxChainToRemove(const AudioFxChain& currentFxChain,
|
|||
const AudioFxChain& newFxChain,
|
||||
AudioFxChain& resultChain)
|
||||
{
|
||||
std::set_difference(newFxChain.begin(), newFxChain.end(),
|
||||
currentFxChain.begin(), currentFxChain.end(),
|
||||
std::inserter(resultChain, resultChain.begin()),
|
||||
filterFxParams);
|
||||
for (auto it = currentFxChain.cbegin(); it != currentFxChain.cend(); ++it) {
|
||||
auto newIt = newFxChain.find(it->first);
|
||||
|
||||
if (newIt == newFxChain.cend()) {
|
||||
resultChain.insert({ it->first, it->second });
|
||||
continue;
|
||||
}
|
||||
|
||||
if (it->second != newIt->second) {
|
||||
resultChain.insert({ it->first, it->second });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void VstFxResolver::fxChainToCreate(const AudioFxChain& currentFxChain,
|
||||
const AudioFxChain& newFxChain,
|
||||
AudioFxChain& resultChain)
|
||||
{
|
||||
std::set_difference(currentFxChain.begin(), currentFxChain.end(),
|
||||
newFxChain.begin(), newFxChain.end(),
|
||||
std::inserter(resultChain, resultChain.begin()),
|
||||
filterFxParams);
|
||||
for (auto it = newFxChain.cbegin(); it != newFxChain.cend(); ++it) {
|
||||
if (currentFxChain.find(it->first) != currentFxChain.cend()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (it->second.isValid()) {
|
||||
resultChain.insert({ it->first, it->second });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ ISynthesizerPtr VstiResolver::resolveSynth(const audio::TrackId trackId, const a
|
|||
pluginsRegister()->unregisterInstrPlugin(trackId, pair.first);
|
||||
}
|
||||
|
||||
pair.first = params.resourceMeta.id;
|
||||
pair.second = createSynth(trackId, params);
|
||||
|
||||
return pair.second;
|
||||
|
|
|
@ -35,6 +35,8 @@ VstAudioClient::~VstAudioClient()
|
|||
}
|
||||
|
||||
m_pluginComponent->setActive(false);
|
||||
m_pluginComponent->terminate();
|
||||
m_pluginComponent->release();
|
||||
}
|
||||
|
||||
void VstAudioClient::init(VstPluginType&& type, VstPluginPtr plugin, audio::audioch_t&& audioChannelsCount)
|
||||
|
@ -132,6 +134,10 @@ audio::samples_t VstAudioClient::process(float* output, audio::samples_t samples
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (!m_isActive) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
m_processData.numSamples = samplesPerChannel;
|
||||
|
||||
if (m_type == VstPluginType::Fx) {
|
||||
|
|
|
@ -121,7 +121,7 @@ VstPluginPtr VstPluginsRegister::masterFxPlugin(const audio::AudioResourceId& re
|
|||
|
||||
auto pluginSearch = m_masterPluginsMap.find({ resourceId, chainOrder });
|
||||
if (pluginSearch == m_masterPluginsMap.end()) {
|
||||
LOGE() << "Unable to find master plugin, resourceId: " << resourceId;
|
||||
LOGE() << "Unable to find master plugin, resourceId: " << resourceId << ", chainOrder: " << chainOrder;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
@ -560,7 +560,7 @@ Score::FileError importBww(MasterScore* score, const QString& path)
|
|||
Bww::Lexer lex(&fp);
|
||||
Bww::MsScWriter wrt;
|
||||
wrt.setScore(score);
|
||||
score->style().set(Sid::measureSpacing, 1.0);
|
||||
score->resetStyleValue(Sid::measureSpacing);
|
||||
Bww::Parser p(lex, wrt);
|
||||
p.parse();
|
||||
|
||||
|
|
|
@ -808,7 +808,7 @@
|
|||
<accidental>-7</accidental>
|
||||
</KeySig>
|
||||
<Beam>
|
||||
<l1>2</l1>
|
||||
<l1>8</l1>
|
||||
<l2>0</l2>
|
||||
</Beam>
|
||||
<Chord>
|
||||
|
|
|
@ -235,7 +235,7 @@
|
|||
</widget>
|
||||
<widget class="QStackedWidget" name="pageStack">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
<number>8</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="PageScore">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_20">
|
||||
|
@ -273,8 +273,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>623</width>
|
||||
<height>696</height>
|
||||
<width>711</width>
|
||||
<height>570</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_10">
|
||||
|
@ -847,8 +847,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>634</width>
|
||||
<height>674</height>
|
||||
<width>659</width>
|
||||
<height>630</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_4">
|
||||
|
@ -2161,8 +2161,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>738</width>
|
||||
<height>392</height>
|
||||
<width>717</width>
|
||||
<height>362</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_9">
|
||||
|
@ -2912,8 +2912,7 @@
|
|||
<widget class="mu::notation::OffsetSelect" name="measureNumberPosAbove" native="true"/>
|
||||
</item>
|
||||
<item row="1" column="6">
|
||||
<widget class="QToolButton" name="resetMeasureNumberHPlacement">
|
||||
</widget>
|
||||
<widget class="QToolButton" name="resetMeasureNumberHPlacement"/>
|
||||
</item>
|
||||
<item row="4" column="4" rowspan="2" colspan="2">
|
||||
<widget class="mu::notation::OffsetSelect" name="measureNumberPosBelow" native="true"/>
|
||||
|
@ -2926,8 +2925,7 @@
|
|||
</widget>
|
||||
</item>
|
||||
<item row="0" column="6">
|
||||
<widget class="QToolButton" name="resetMeasureNumberVPlacement">
|
||||
</widget>
|
||||
<widget class="QToolButton" name="resetMeasureNumberVPlacement"/>
|
||||
</item>
|
||||
<item row="1" column="4" colspan="2">
|
||||
<widget class="QComboBox" name="measureNumberHPlacement"/>
|
||||
|
@ -2981,8 +2979,7 @@
|
|||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_48">
|
||||
<item row="0" column="2">
|
||||
<widget class="QToolButton" name="resetMmRestRangeBracketType">
|
||||
</widget>
|
||||
<widget class="QToolButton" name="resetMmRestRangeBracketType"/>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="mmRestRangeBracketType"/>
|
||||
|
@ -3049,8 +3046,7 @@
|
|||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QToolButton" name="resetMmRestRangeVPlacement">
|
||||
</widget>
|
||||
<widget class="QToolButton" name="resetMmRestRangeVPlacement"/>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_166">
|
||||
|
@ -3063,8 +3059,7 @@
|
|||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QToolButton" name="resetMmRestRangeHPlacement">
|
||||
</widget>
|
||||
<widget class="QToolButton" name="resetMmRestRangeHPlacement"/>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="mmRestRangePosBelowLabel">
|
||||
|
@ -3799,8 +3794,8 @@ By default, they will be placed such as that their right end are at the same lev
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>422</width>
|
||||
<height>900</height>
|
||||
<width>711</width>
|
||||
<height>680</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_56">
|
||||
|
@ -4013,7 +4008,7 @@ By default, they will be placed such as that their right end are at the same lev
|
|||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_11">
|
||||
<property name="text">
|
||||
<string>Spacing (1=tight):</string>
|
||||
<string>Spacing curve:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>measureSpacing</cstring>
|
||||
|
@ -4394,9 +4389,15 @@ By default, they will be placed such as that their right end are at the same lev
|
|||
<property name="minimum">
|
||||
<double>1.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>2.000000000000000</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>1.500000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
|
@ -5749,8 +5750,8 @@ By default, they will be placed such as that their right end are at the same lev
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>572</width>
|
||||
<height>527</height>
|
||||
<width>556</width>
|
||||
<height>496</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_54">
|
||||
|
@ -9231,8 +9232,8 @@ By default, they will be placed such as that their right end are at the same lev
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>584</width>
|
||||
<height>465</height>
|
||||
<width>595</width>
|
||||
<height>420</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_57">
|
||||
|
@ -10527,7 +10528,7 @@ By default, they will be placed such as that their right end are at the same lev
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>574</width>
|
||||
<width>613</width>
|
||||
<height>551</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
|
|
@ -186,6 +186,17 @@ Notification PlaybackController::currentTrackSequenceIdChanged() const
|
|||
return m_currentSequenceIdChanged;
|
||||
}
|
||||
|
||||
mu::engraving::InstrumentTrackId PlaybackController::instrumentTrackIdForAudioTrackId(audio::TrackId theTrackId) const
|
||||
{
|
||||
for (auto [instrumentTrackId, audioTrackId] : m_trackIdMap) {
|
||||
if (audioTrackId == theTrackId) {
|
||||
return instrumentTrackId;
|
||||
}
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
void PlaybackController::playElement(const notation::EngravingItem* element)
|
||||
{
|
||||
IF_ASSERT_FAILED(element) {
|
||||
|
@ -246,15 +257,17 @@ void PlaybackController::onNotationChanged()
|
|||
|
||||
INotationPartsPtr notationParts = m_notation->parts();
|
||||
|
||||
if (!m_trackIdMap.empty()) {
|
||||
for (const Part* part : m_masterNotation->parts()->partList()) {
|
||||
bool isActive = notationParts->partExists(part->id());
|
||||
updateMuteStates();
|
||||
|
||||
for (const InstrumentTrackId& instrumentTrackId : part->instrumentTrackIdSet()) {
|
||||
setTrackActivity(instrumentTrackId, isActive);
|
||||
}
|
||||
}
|
||||
}
|
||||
NotifyList<const Part*> partList = notationParts->partList();
|
||||
|
||||
partList.onItemAdded(this, [this](const Part*) {
|
||||
updateMuteStates();
|
||||
});
|
||||
|
||||
partList.onItemChanged(this, [this](const Part*) {
|
||||
updateMuteStates();
|
||||
});
|
||||
|
||||
notationPlayback()->loopBoundaries().ch.onReceive(this, [this](const LoopBoundaries& boundaries) {
|
||||
setLoop(boundaries);
|
||||
|
@ -552,6 +565,8 @@ void PlaybackController::addTrack(const InstrumentTrackId& instrumentTrackId, co
|
|||
|
||||
audioSettings()->setTrackInputParams(instrumentTrackId, appliedParams.in);
|
||||
audioSettings()->setTrackOutputParams(instrumentTrackId, appliedParams.out);
|
||||
|
||||
updateMuteStates();
|
||||
})
|
||||
.onReject(this, [](int code, const std::string& msg) {
|
||||
LOGE() << "can't add a new track, code: [" << code << "] " << msg;
|
||||
|
@ -617,6 +632,8 @@ void PlaybackController::removeNonExistingTracks()
|
|||
removeTrack(instrumentTrackId);
|
||||
}
|
||||
}
|
||||
|
||||
updateMuteStates();
|
||||
}
|
||||
|
||||
void PlaybackController::removeTrack(const InstrumentTrackId& instrumentTrackId)
|
||||
|
@ -708,8 +725,8 @@ void PlaybackController::setupSequenceTracks()
|
|||
NotifyList<const Part*> partList = masterNotationParts()->partList();
|
||||
|
||||
for (const Part* part : partList) {
|
||||
for (const auto& pair : *part->instruments()) {
|
||||
addTrack({ part->id(), pair.second->id().toStdString() }, part->partName().toStdString());
|
||||
for (const InstrumentTrackId& trackId : part->instrumentTrackIdSet()) {
|
||||
addTrack(trackId, part->partName().toStdString());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -730,23 +747,20 @@ void PlaybackController::setupSequenceTracks()
|
|||
});
|
||||
|
||||
partList.onItemChanged(this, [this](const Part* part) {
|
||||
for (const auto& pair : *part->instruments()) {
|
||||
InstrumentTrackId trackId = { part->id(), pair.second->id().toStdString() };
|
||||
AudioOutputParams params = trackOutputParams(trackId);
|
||||
|
||||
for (const InstrumentTrackId& trackId : part->instrumentTrackIdSet()) {
|
||||
auto search = m_trackIdMap.find(trackId);
|
||||
if (search == m_trackIdMap.cend()) {
|
||||
removeNonExistingTracks();
|
||||
addTrack(trackId, part->partName().toStdString());
|
||||
continue;
|
||||
}
|
||||
|
||||
if (params.muted == !part->isVisible()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
setTrackActivity(trackId, part->isVisible());
|
||||
}
|
||||
|
||||
updateMuteStates();
|
||||
});
|
||||
|
||||
audioSettings()->soloMuteStateChanged().onReceive(this,
|
||||
[this](const InstrumentTrackId&, const project::IProjectAudioSettings::SoloMuteState&) {
|
||||
updateMuteStates();
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -787,6 +801,50 @@ void PlaybackController::setupSequencePlayer()
|
|||
});
|
||||
}
|
||||
|
||||
void PlaybackController::updateMuteStates()
|
||||
{
|
||||
if (!masterNotationParts() || !audioSettings() || !playback()) {
|
||||
return;
|
||||
}
|
||||
|
||||
NotifyList<const Part*> masterPartList = masterNotationParts()->partList();
|
||||
bool hasSolo = false;
|
||||
|
||||
for (const Part* masterPart : masterPartList) {
|
||||
for (const InstrumentTrackId& instrumentTrackId : masterPart->instrumentTrackIdSet()) {
|
||||
if (audioSettings()->soloMuteState(instrumentTrackId).solo) {
|
||||
hasSolo = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
INotationPartsPtr notationParts = m_notation->parts();
|
||||
|
||||
for (const Part* masterPart : masterPartList) {
|
||||
const Part* part = notationParts->part(masterPart->id());
|
||||
bool isPartVisible = part && part->show();
|
||||
|
||||
for (const InstrumentTrackId& instrumentTrackId : masterPart->instrumentTrackIdSet()) {
|
||||
if (!mu::contains(m_trackIdMap, instrumentTrackId)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto soloMuteState = audioSettings()->soloMuteState(instrumentTrackId);
|
||||
|
||||
bool shouldBeMuted = soloMuteState.mute
|
||||
|| (hasSolo && !soloMuteState.solo)
|
||||
|| (!isPartVisible);
|
||||
|
||||
AudioOutputParams params = trackOutputParams(instrumentTrackId);
|
||||
params.muted = shouldBeMuted;
|
||||
|
||||
audio::TrackId trackId = m_trackIdMap.at(instrumentTrackId);
|
||||
playback()->audioOutput()->setOutputParams(m_currentSequenceId, trackId, std::move(params));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool PlaybackController::actionChecked(const ActionCode& actionCode) const
|
||||
{
|
||||
QMap<std::string, bool> isChecked {
|
||||
|
|
|
@ -73,6 +73,8 @@ public:
|
|||
audio::TrackSequenceId currentTrackSequenceId() const override;
|
||||
async::Notification currentTrackSequenceIdChanged() const override;
|
||||
|
||||
engraving::InstrumentTrackId instrumentTrackIdForAudioTrackId(audio::TrackId trackId) const override;
|
||||
|
||||
void playElement(const notation::EngravingItem* element) override;
|
||||
|
||||
bool actionChecked(const actions::ActionCode& actionCode) const override;
|
||||
|
@ -134,6 +136,8 @@ private:
|
|||
void setupSequenceTracks();
|
||||
void setupSequencePlayer();
|
||||
|
||||
void updateMuteStates();
|
||||
|
||||
void setCurrentTick(const midi::tick_t tick);
|
||||
void addTrack(const engraving::InstrumentTrackId& instrumentTrackId, const std::string& title);
|
||||
void setTrackActivity(const engraving::InstrumentTrackId& instrumentTrackId, const bool isActive);
|
||||
|
|
|
@ -51,9 +51,12 @@ public:
|
|||
virtual async::Notification playbackPositionChanged() const = 0;
|
||||
virtual async::Channel<uint32_t> midiTickPlayed() const = 0;
|
||||
virtual float playbackPositionInSeconds() const = 0;
|
||||
|
||||
virtual audio::TrackSequenceId currentTrackSequenceId() const = 0;
|
||||
virtual async::Notification currentTrackSequenceIdChanged() const = 0;
|
||||
|
||||
virtual engraving::InstrumentTrackId instrumentTrackIdForAudioTrackId(audio::TrackId trackId) const = 0;
|
||||
|
||||
virtual void playElement(const notation::EngravingItem* element) = 0;
|
||||
|
||||
virtual bool actionChecked(const actions::ActionCode& actionCode) const = 0;
|
||||
|
|
|
@ -50,6 +50,9 @@ MixerPanelSection {
|
|||
icon: IconCode.MUTE
|
||||
checked: channelItem.muted
|
||||
|
||||
// TODO: not use `enabled` for this, but present visually in some other way
|
||||
enabled: !(channelItem.muted && !channelItem.mutedManually)
|
||||
|
||||
navigation.name: "MuteButton"
|
||||
navigation.panel: channelItem.panel
|
||||
navigation.row: root.navigationRowStart
|
||||
|
@ -61,7 +64,7 @@ MixerPanelSection {
|
|||
}
|
||||
|
||||
onToggled: {
|
||||
channelItem.muted = !channelItem.muted
|
||||
channelItem.mutedManually = !checked
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -62,3 +62,13 @@ bool AbstractAudioResourceItem::hasNativeEditorSupport() const
|
|||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const mu::UriQuery& AbstractAudioResourceItem::editorUri() const
|
||||
{
|
||||
return m_editorUri;
|
||||
}
|
||||
|
||||
void AbstractAudioResourceItem::setEditorUri(const UriQuery& uri)
|
||||
{
|
||||
m_editorUri = uri;
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue