Compare commits

...

21 Commits

Author SHA1 Message Date
Igor Korsukov cafefd7689 update timeserver for win on CI again 2022-03-29 18:56:43 +02:00
Igor Korsukov 3b8728d034 Merge branch 'master' of github.com:musescore/MuseScore 2022-03-29 18:56:39 +02:00
Igor Korsukov 89792908e9 update timeserver for win on CI 2022-03-29 18:56:14 +02:00
Igor Korsukov 4baba6ef45 updated win cert 2022-03-29 18:55:58 +02:00
Igor Korsukov fcf16719ad updated win cert on CI 2022-03-29 18:55:41 +02:00
pereverzev_v 0f5cebe66b Ensure that we're processing only active plugins 2022-03-29 17:47:39 +02:00
vpereverzev 02fb378c4f Accessing next segment for fermata calculations, even if segment belongs to next measure 2022-03-29 17:47:32 +02:00
vpereverzev c927a4b41b Fixed an issue with wrong calculations of pauses duration 2022-03-29 17:47:20 +02:00
RomanPudashkin c6b3ddb575 Merge pull request #10824 from cbjeukendrup/solo_mute
Fix solo/mute interactions in Mixer
2022-03-29 11:37:50 +02:00
Eism c7756a9591 fixed #9658: Resolve current screen for popups by parent item 2022-03-29 11:37:43 +02:00
Michele Spagnolo 4466e21d36 utest fixes 2022-03-28 18:24:07 +02:00
Michele Spagnolo 4ed987c60b Polyrythms improvement 2022-03-28 18:24:04 +02:00
Michele Spagnolo fa4b3a9592 Overall spacing improvement 2022-03-28 18:24:00 +02:00
Michele Spagnolo dc6fd951de Improved logic for controlling long notes spacing 2022-03-28 18:23:56 +02:00
Michele Spagnolo 630f5726d4 Roll back acceptanceRange idea 2022-03-28 18:23:53 +02:00
pereverzev_v 45f370bbf3 Properly release memory for vst plugin 2022-03-28 18:23:43 +02:00
RomanPudashkin 5bc161142d Merge pull request #10911 from RomanPudashkin/close_vst_editors_on_replacing_plugins
[MU4] Fix #9753: When replacing a VSTi, current VSTi should be closed
2022-03-28 18:23:30 +02:00
vpereverzev bc7a9b9203 Decreased the default gain in Fluid 2022-03-28 18:35:29 +02:00
vpereverzev 88c0b6d92c Refined winds articulation profile 2022-03-28 18:35:09 +02:00
pereverzev_v 13c094c92c Fixed an issue with arpeggio for strings 2022-03-28 18:35:03 +02:00
Igor Korsukov 760274a6ad fixed use std map 2022-03-28 17:45:07 +02:00
132 changed files with 717 additions and 5303 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -215,6 +215,8 @@ public:
void layoutMeasureElements();
Fraction computeTicks();
Fraction shortestChordRest() const;
Fraction maxTicks() const;
void layout2();
bool showsMeasureNumber();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -237,6 +237,7 @@ public:
int lastVisibleSysStaffOfPart(const Part* part) const;
Fraction minSysTicks() const;
Fraction maxSysTicks() const;
bool isSqueezable() const;
};

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -739,7 +739,7 @@
</Note>
</Chord>
<Beam>
<l1>-6</l1>
<l1>-8</l1>
<l2>-10</l2>
</Beam>
<Chord>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -218,6 +218,7 @@ protected:
void setErrCode(Ret::Code code);
QScreen* resolveScreen() const;
QRect currentScreenGeometry() const;
void updatePosition();
void updateContentPosition();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -808,7 +808,7 @@
<accidental>-7</accidental>
</KeySig>
<Beam>
<l1>2</l1>
<l1>8</l1>
<l2>0</l2>
</Beam>
<Chord>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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