You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
(1) |
Apr
(1) |
May
|
Jun
(1) |
Jul
|
Aug
(10) |
Sep
|
Oct
|
Nov
|
Dec
(3) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(1) |
Feb
(2) |
Mar
(3) |
Apr
(2) |
May
(10) |
Jun
(2) |
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(3) |
Dec
|
2008 |
Jan
(6) |
Feb
(4) |
Mar
(5) |
Apr
(2) |
May
(1) |
Jun
(1) |
Jul
(4) |
Aug
(6) |
Sep
(2) |
Oct
(9) |
Nov
(1) |
Dec
(4) |
2009 |
Jan
(9) |
Feb
(2) |
Mar
(2) |
Apr
(2) |
May
(6) |
Jun
(18) |
Jul
(33) |
Aug
(39) |
Sep
(33) |
Oct
(24) |
Nov
(23) |
Dec
(22) |
2010 |
Jan
(29) |
Feb
(32) |
Mar
(51) |
Apr
(17) |
May
(31) |
Jun
(21) |
Jul
(32) |
Aug
(28) |
Sep
(35) |
Oct
(27) |
Nov
(11) |
Dec
(13) |
2011 |
Jan
(14) |
Feb
(13) |
Mar
(27) |
Apr
(27) |
May
(28) |
Jun
(20) |
Jul
(43) |
Aug
(52) |
Sep
(66) |
Oct
(61) |
Nov
(11) |
Dec
(8) |
2012 |
Jan
(20) |
Feb
(30) |
Mar
(38) |
Apr
(21) |
May
(33) |
Jun
(21) |
Jul
(25) |
Aug
(9) |
Sep
(24) |
Oct
(42) |
Nov
(27) |
Dec
(41) |
2013 |
Jan
(20) |
Feb
(35) |
Mar
(156) |
Apr
(298) |
May
(258) |
Jun
(201) |
Jul
(105) |
Aug
(60) |
Sep
(193) |
Oct
(245) |
Nov
(280) |
Dec
(194) |
2014 |
Jan
(63) |
Feb
(202) |
Mar
(200) |
Apr
(23) |
May
(53) |
Jun
(105) |
Jul
(18) |
Aug
(26) |
Sep
(110) |
Oct
(187) |
Nov
(97) |
Dec
(74) |
2015 |
Jan
(45) |
Feb
(55) |
Mar
(116) |
Apr
(116) |
May
(193) |
Jun
(164) |
Jul
(50) |
Aug
(111) |
Sep
(98) |
Oct
(71) |
Nov
(103) |
Dec
(63) |
2016 |
Jan
(33) |
Feb
(101) |
Mar
(182) |
Apr
(139) |
May
(140) |
Jun
(103) |
Jul
(165) |
Aug
(286) |
Sep
(208) |
Oct
(127) |
Nov
(97) |
Dec
(54) |
2017 |
Jan
(64) |
Feb
(335) |
Mar
(202) |
Apr
(212) |
May
(139) |
Jun
(127) |
Jul
(294) |
Aug
(154) |
Sep
(170) |
Oct
(152) |
Nov
(156) |
Dec
(62) |
2018 |
Jan
(168) |
Feb
(237) |
Mar
(196) |
Apr
(174) |
May
(174) |
Jun
(161) |
Jul
(127) |
Aug
(88) |
Sep
(149) |
Oct
(66) |
Nov
(52) |
Dec
(135) |
2019 |
Jan
(146) |
Feb
(126) |
Mar
(104) |
Apr
(58) |
May
(60) |
Jun
(28) |
Jul
(197) |
Aug
(129) |
Sep
(141) |
Oct
(148) |
Nov
(63) |
Dec
(100) |
2020 |
Jan
(74) |
Feb
(37) |
Mar
(59) |
Apr
(154) |
May
(194) |
Jun
(133) |
Jul
(313) |
Aug
(197) |
Sep
(49) |
Oct
(162) |
Nov
(143) |
Dec
(57) |
2021 |
Jan
(120) |
Feb
(107) |
Mar
(314) |
Apr
(157) |
May
(524) |
Jun
(169) |
Jul
(72) |
Aug
(133) |
Sep
(135) |
Oct
(146) |
Nov
(198) |
Dec
(325) |
2022 |
Jan
(409) |
Feb
(249) |
Mar
(138) |
Apr
(95) |
May
(102) |
Jun
(221) |
Jul
(66) |
Aug
(120) |
Sep
(192) |
Oct
(131) |
Nov
(53) |
Dec
(171) |
2023 |
Jan
(357) |
Feb
(82) |
Mar
(168) |
Apr
(218) |
May
(196) |
Jun
(86) |
Jul
(115) |
Aug
(49) |
Sep
(190) |
Oct
(102) |
Nov
(45) |
Dec
(76) |
2024 |
Jan
(86) |
Feb
(50) |
Mar
(324) |
Apr
(209) |
May
(197) |
Jun
(232) |
Jul
(194) |
Aug
(247) |
Sep
(219) |
Oct
(266) |
Nov
(328) |
Dec
(304) |
2025 |
Jan
(191) |
Feb
(115) |
Mar
(137) |
Apr
(32) |
May
(126) |
Jun
(403) |
Jul
(68) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <sv...@op...> - 2025-05-17 19:51:20
|
Author: sagamusix Date: Sat May 17 21:51:11 2025 New Revision: 23166 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23166 Log: [Mod] Pattern Properties: Place input fields more uniformly. Modified: trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Fri May 16 21:48:54 2025 (r23165) +++ trunk/OpenMPT/mptrack/mptrack.rc Sat May 17 21:51:11 2025 (r23166) @@ -683,483 +683,6 @@ PUSHBUTTON "&Browse...",IDC_BUTTON2,210,156,50,12 END - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_MISSINGSAMPLES, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 312 - TOPMARGIN, 7 - BOTTOMMARGIN, 178 - END - - IDD_CLEANUP_SONG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 387 - TOPMARGIN, 7 - BOTTOMMARGIN, 147 - END - - IDD_KEYBOARD_SPLIT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 177 - TOPMARGIN, 7 - BOTTOMMARGIN, 130 - END - - IDD_SAMPLE_GENERATOR, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 297 - TOPMARGIN, 7 - BOTTOMMARGIN, 184 - END - - IDD_SAMPLE_GENERATOR_PRESETS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 309 - TOPMARGIN, 7 - BOTTOMMARGIN, 94 - END - - IDD_MIXSAMPLES, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 189 - TOPMARGIN, 7 - BOTTOMMARGIN, 82 - END - - IDD_OPTIONS_SAMPLEEDITOR, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 318 - TOPMARGIN, 7 - END - - IDD_EDITHISTORY, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 309 - TOPMARGIN, 7 - BOTTOMMARGIN, 178 - END - - IDD_SAMPLE_GRID_SIZE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 147 - TOPMARGIN, 7 - BOTTOMMARGIN, 64 - END - - IDD_SAMPLE_XFADE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 285 - TOPMARGIN, 7 - BOTTOMMARGIN, 94 - END - - IDD_OPTIONS_UPDATE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 318 - TOPMARGIN, 7 - BOTTOMMARGIN, 307 - END - - IDD_CLOSEDOCUMENTS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 363 - TOPMARGIN, 7 - BOTTOMMARGIN, 190 - END - - IDD_AUTOTUNE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 159 - TOPMARGIN, 7 - BOTTOMMARGIN, 75 - END - - IDD_CHANNELSETTINGS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 237 - TOPMARGIN, 7 - BOTTOMMARGIN, 88 - END - - IDD_CLIPBOARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 176 - TOPMARGIN, 7 - BOTTOMMARGIN, 194 - END - - IDD_INPUT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 159 - TOPMARGIN, 7 - BOTTOMMARGIN, 59 - END - - IDD_OPTIONS_ADVANCED, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 318 - TOPMARGIN, 7 - BOTTOMMARGIN, 274 - END - - IDD_SCANPLUGINS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 309 - TOPMARGIN, 7 - BOTTOMMARGIN, 27 - END - - IDD_RESAMPLE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 190 - TOPMARGIN, 7 - BOTTOMMARGIN, 115 - END - - IDD_WECLOME, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 250 - TOPMARGIN, 7 - BOTTOMMARGIN, 259 - END - - IDD_UPDATE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 189 - TOPMARGIN, 7 - BOTTOMMARGIN, 131 - END - - IDD_TEMPO_SWING, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 239 - TOPMARGIN, 7 - BOTTOMMARGIN, 136 - END - - IDD_LEGACY_PLAYBACK, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 382 - TOPMARGIN, 7 - BOTTOMMARGIN, 237 - END - - IDD_FIND_RANGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 249 - TOPMARGIN, 7 - BOTTOMMARGIN, 46 - END - - IDD_MIDI_IO_PLUGIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 245 - TOPMARGIN, 7 - BOTTOMMARGIN, 208 - END - - IDD_OPTIONS_WINE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 319 - TOPMARGIN, 7 - BOTTOMMARGIN, 304 - END - - IDD_LFOPLUGIN, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 296 - TOPMARGIN, 7 - BOTTOMMARGIN, 194 - END - - IDD_OPL_PARAMS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 403 - TOPMARGIN, 7 - BOTTOMMARGIN, 211 - END - - IDD_MISSINGPLUGS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 300 - TOPMARGIN, 7 - BOTTOMMARGIN, 163 - END - - IDD_MODIFIEDSAMPLES, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 312 - TOPMARGIN, 7 - BOTTOMMARGIN, 178 - END - - IDD_OPLEXPORT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 302 - TOPMARGIN, 7 - BOTTOMMARGIN, 151 - END - - IDD_METRONOME_SETTINGS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 272 - TOPMARGIN, 7 - BOTTOMMARGIN, 200 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDR_MODULETYPE ICON "res\\moddoc.ico" - - -///////////////////////////////////////////////////////////////////////////// -// -// PNG -// - -IDB_ENVTOOLBAR PNG "res\\envelope_toolbar.png" - -IDB_IMAGELIST PNG "res\\icons.png" - -IDB_MAINBAR PNG "res\\main_toolbar.png" - -IDB_PATTERNS PNG "res\\pattern_toolbar.png" - -IDB_SMPTOOLBAR PNG "res\\sample_toolbar.png" - -IDB_SPLASHNOFOLDFIN PNG "res\\Splash.png" - -IDB_MPTRACK PNG "res\\About.png" - -IDB_NEW_BIG PNG "res\\New32.png" - -IDB_OPEN_BIG PNG "res\\Open32.png" - - -///////////////////////////////////////////////////////////////////////////// -// -// AFX_DIALOG_LAYOUT -// - -IDD_MIDI_IO_PLUGIN AFX_DIALOG_LAYOUT -BEGIN - 0, - 0, 0, 100, 0, - 0, 0, 100, 0, - 0, 0, 100, 0, - 0, 0, 100, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 100, 100, - 0, 0, 100, 100, - 0, 100, 0, 0, - 100, 100, 0, 0, - 100, 100, 0, 0, - 0, 100, 100, 0, - 0, 100, 0, 0, - 0, 100, 100, 0 -END - -IDD_LFOPLUGIN AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -IDD_OPTIONS_SAMPLEEDITOR AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -IDD_OPTIONS_WINE AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -IDD_CLIPBOARD AFX_DIALOG_LAYOUT -BEGIN - 0, - 0, 0, 100, 100, - 0, 100, 0, 0, - 0, 100, 0, 0, - 0, 100, 0, 0, - 0, 100, 0, 0 -END - -IDD_OPL_PARAMS AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -IDD_CLOSEDOCUMENTS AFX_DIALOG_LAYOUT -BEGIN - 0, - 100, 100, 0, 0, - 100, 100, 0, 0, - 0, 0, 100, 100, - 0, 100, 0, 0, - 100, 100, 0, 0, - 100, 100, 0, 0 -END - -IDD_MISSINGPLUGS AFX_DIALOG_LAYOUT -BEGIN - 0, - 100, 100, 0, 0, - 0, 0, 0, 0, - 0, 0, 100, 100, - 100, 100, 0, 0 -END - -IDD_MISSINGSAMPLES AFX_DIALOG_LAYOUT -BEGIN - 0, - 100, 100, 0, 0, - 0, 0, 0, 0, - 0, 0, 100, 100, - 0, 100, 0, 0, - 0, 100, 100, 0 -END - -IDD_OPTIONS_UPDATE AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -IDD_WECLOME AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -IDD_LEGACY_PLAYBACK AFX_DIALOG_LAYOUT -BEGIN - 0, - 100, 100, 0, 0, - 100, 100, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 100, 0, - 0, 0, 100, 100, - 0, 100, 0, 0, - 0, 100, 0, 0 -END - -IDD_EDITHISTORY AFX_DIALOG_LAYOUT -BEGIN - 0, - 100, 100, 0, 0, - 0, 100, 0, 0, - 0, 0, 100, 100, - 0, 100, 100, 0 -END - -IDD_MODIFIEDSAMPLES AFX_DIALOG_LAYOUT -BEGIN - 0, - 100, 100, 0, 0, - 0, 0, 0, 0, - 0, 0, 100, 100, - 100, 100, 0, 0, - 100, 100, 0, 0, - 0, 100, 100, 0 -END - -IDD_UPDATE AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -IDD_CHANNELSETTINGS AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -IDD_RESAMPLE AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -IDD_OPLEXPORT AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -IDD_OPTIONS_ADVANCED AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -IDD_METRONOME_SETTINGS AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -#endif // German (Germany) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - IDD_ABOUTBOX DIALOGEX 0, 0, 340, 266 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "About OpenMPT" @@ -1926,24 +1449,24 @@ LTEXT "Name:",IDC_STATIC,6,26,36,8 EDITTEXT IDC_EDIT2,42,24,84,12,ES_AUTOHSCROLL CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,48,184,1 - LTEXT "&Rows:",IDC_STATIC,12,54,108,8 - COMBOBOX IDC_COMBO1,12,66,48,93,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&/2",IDC_BUTTON_HALF,66,66,18,12 - PUSHBUTTON "&x2",IDC_BUTTON_DOUBLE,90,66,18,12 - LTEXT "Remove rows from / Add rows at:",IDC_STATIC,12,84,126,8 - CONTROL "&Top of Pattern",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,12,96,84,12 - CONTROL "&Bottom of Pattern",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,96,96,84,12 + LTEXT "&Rows:",IDC_STATIC,6,56,36,8 + COMBOBOX IDC_COMBO1,42,54,48,93,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "&/2",IDC_BUTTON_HALF,96,54,18,12 + PUSHBUTTON "&x2",IDC_BUTTON_DOUBLE,120,54,18,12 + LTEXT "Remove rows from / Add rows at:",IDC_STATIC,6,78,126,8 + CONTROL "&Top of Pattern",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,6,90,84,12 + CONTROL "&Bottom of Pattern",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,90,90,84,12 CONTROL "Repeat pattern contents when &adding rows",IDC_CHECK2, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,114,168,10 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,132,184,1 - CONTROL "Override &song signature:",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,138,108,12 - PUSHBUTTON "Configure S&wing",IDC_BUTTON1,124,138,66,12 - LTEXT "Rows per b&eat",IDC_STATIC,64,159,126,8 - EDITTEXT IDC_ROWSPERBEAT,24,156,30,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,48,159,11,14 - LTEXT "Rows per &measure",IDC_STATIC,64,176,126,8 - EDITTEXT IDC_ROWSPERMEASURE,24,175,30,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_SPIN3,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,48,173,11,14 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,108,168,10 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,126,184,1 + CONTROL "Override &song signature:",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,132,114,12 + PUSHBUTTON "Configure S&wing",IDC_BUTTON1,124,132,66,12 + LTEXT "Rows per b&eat",IDC_STATIC,58,153,128,8 + EDITTEXT IDC_ROWSPERBEAT,18,151,30,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,42,153,11,14 + LTEXT "Rows per &measure",IDC_STATIC,58,170,128,8 + EDITTEXT IDC_ROWSPERMEASURE,18,169,30,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN3,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,42,167,11,14 DEFPUSHBUTTON "&OK",IDOK,140,6,50,14 PUSHBUTTON "&Cancel",IDCANCEL,140,24,50,14 END @@ -2405,273 +1928,263 @@ #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN - IDD_ABOUTBOX, DIALOG + IDD_MISSINGSAMPLES, DIALOG BEGIN - RIGHTMARGIN, 334 - BOTTOMMARGIN, 261 + LEFTMARGIN, 7 + RIGHTMARGIN, 312 + TOPMARGIN, 7 + BOTTOMMARGIN, 178 END - IDD_OPTIONS_PLAYER, DIALOG + IDD_CLEANUP_SONG, DIALOG BEGIN - LEFTMARGIN, 6 - RIGHTMARGIN, 318 - VERTGUIDE, 50 - VERTGUIDE, 169 + LEFTMARGIN, 7 + RIGHTMARGIN, 387 + TOPMARGIN, 7 + BOTTOMMARGIN, 147 END - IDD_WAVECONVERT, DIALOG + IDD_KEYBOARD_SPLIT, DIALOG BEGIN - RIGHTMARGIN, 338 - BOTTOMMARGIN, 281 + LEFTMARGIN, 7 + RIGHTMARGIN, 177 + TOPMARGIN, 7 + BOTTOMMARGIN, 130 END - IDD_PROGRESS, DIALOG + IDD_SAMPLE_GENERATOR, DIALOG BEGIN - RIGHTMARGIN, 186 + LEFTMARGIN, 7 + RIGHTMARGIN, 297 + TOPMARGIN, 7 + BOTTOMMARGIN, 184 END - IDD_OPTIONS_KEYBOARD, DIALOG + IDD_SAMPLE_GENERATOR_PRESETS, DIALOG BEGIN - LEFTMARGIN, 5 - RIGHTMARGIN, 320 - TOPMARGIN, 5 + LEFTMARGIN, 7 + RIGHTMARGIN, 309 + TOPMARGIN, 7 + BOTTOMMARGIN, 94 END - IDD_OPTIONS_COLORS, DIALOG + IDD_MIXSAMPLES, DIALOG BEGIN - LEFTMARGIN, 6 - RIGHTMARGIN, 318 - TOPMARGIN, 6 + LEFTMARGIN, 7 + RIGHTMARGIN, 189 + TOPMARGIN, 7 + BOTTOMMARGIN, 82 END - IDD_OPTIONS_MIDI, DIALOG + IDD_OPTIONS_SAMPLEEDITOR, DIALOG BEGIN - LEFTMARGIN, 6 + LEFTMARGIN, 7 RIGHTMARGIN, 318 - TOPMARGIN, 6 - END - - IDD_LOADRAWSAMPLE, DIALOG - BEGIN - RIGHTMARGIN, 227 - BOTTOMMARGIN, 127 - END - - IDD_CONTROL_GLOBALS, DIALOG - BEGIN - RIGHTMARGIN, 374 - BOTTOMMARGIN, 118 + TOPMARGIN, 7 END - IDD_CONTROL_COMMENTS, DIALOG + IDD_EDITHISTORY, DIALOG BEGIN - RIGHTMARGIN, 348 + LEFTMARGIN, 7 + RIGHTMARGIN, 309 + TOPMARGIN, 7 + BOTTOMMARGIN, 178 END - IDD_CONTROL_PATTERNS, DIALOG + IDD_SAMPLE_GRID_SIZE, DIALOG BEGIN - RIGHTMARGIN, 554 - VERTGUIDE, 39 - VERTGUIDE, 134 - BOTTOMMARGIN, 76 - HORZGUIDE, 37 - HORZGUIDE, 61 - HORZGUIDE, 73 + LEFTMARGIN, 7 + RIGHTMARGIN, 147 + TOPMARGIN, 7 + BOTTOMMARGIN, 64 END - IDD_CONTROL_SAMPLES, DIALOG + IDD_SAMPLE_XFADE, DIALOG BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 552 - BOTTOMMARGIN, 104 + LEFTMARGIN, 7 + RIGHTMARGIN, 285 + TOPMARGIN, 7 + BOTTOMMARGIN, 94 END - IDD_CONTROL_INSTRUMENTS, DIALOG + IDD_OPTIONS_UPDATE, DIALOG BEGIN - RIGHTMARGIN, 506 - BOTTOMMARGIN, 165 + LEFTMARGIN, 7 + RIGHTMARGIN, 318 + TOPMARGIN, 7 + BOTTOMMARGIN, 307 END - IDD_MODDOC_MODTYPE, DIALOG + IDD_CLOSEDOCUMENTS, DIALOG BEGIN - RIGHTMARGIN, 248 - BOTTOMMARGIN, 280 + LEFTMARGIN, 7 + RIGHTMARGIN, 363 + TOPMARGIN, 7 + BOTTOMMARGIN, 190 END - IDD_REMOVECHANNELS, DIALOG + IDD_AUTOTUNE, DIALOG BEGIN - RIGHTMARGIN, 163 - BOTTOMMARGIN, 219 + LEFTMARGIN, 7 + RIGHTMARGIN, 159 + TOPMARGIN, 7 + BOTTOMMARGIN, 75 END - IDD_VIEW_GLOBALS, DIALOG + IDD_CHANNELSETTINGS, DIALOG BEGIN - BOTTOMMARGIN, 324 + LEFTMARGIN, 7 + RIGHTMARGIN, 237 + TOPMARGIN, 7 + BOTTOMMARGIN, 88 END - IDD_EDIT_FIND, DIALOG + IDD_CLIPBOARD, DIALOG BEGIN + LEFTMARGIN, 7 RIGHTMARGIN, 176 - BOTTOMMARGIN, 146 - END - - IDD_EDIT_REPLACE, DIALOG - BEGIN - RIGHTMARGIN, 182 - BOTTOMMARGIN, 148 - END - - IDD_PATTERN_PROPERTIES, DIALOG - BEGIN - LEFTMARGIN, 6 - RIGHTMARGIN, 190 - TOPMARGIN, 6 - BOTTOMMARGIN, 187 - END - - IDD_PATTERN_EDITCOMMAND, DIALOG - BEGIN - RIGHTMARGIN, 244 - BOTTOMMARGIN, 47 - END - - IDD_SAMPLE_AMPLIFY, DIALOG - BEGIN - RIGHTMARGIN, 184 - BOTTOMMARGIN, 89 + TOPMARGIN, 7 + BOTTOMMARGIN, 194 END - IDD_INFO_BOX, DIALOG + IDD_INPUT, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 266 + RIGHTMARGIN, 159 TOPMARGIN, 7 - BOTTOMMARGIN, 166 + BOTTOMMARGIN, 59 END - IDD_OPTIONS_GENERAL, DIALOG + IDD_OPTIONS_ADVANCED, DIALOG BEGIN - LEFTMARGIN, 4 + LEFTMARGIN, 7 RIGHTMARGIN, 318 - TOPMARGIN, 6 - BOTTOMMARGIN, 313 + TOPMARGIN, 7 + BOTTOMMARGIN, 274 END - IDD_OPTIONS_SOUNDCARD, DIALOG + IDD_SCANPLUGINS, DIALOG BEGIN - LEFTMARGIN, 6 - RIGHTMARGIN, 318 - TOPMARGIN, 6 - BOTTOMMARGIN, 306 + LEFTMARGIN, 7 + RIGHTMARGIN, 309 + TOPMARGIN, 7 + BOTTOMMARGIN, 27 END - IDD_MIDIMACRO, DIALOG + IDD_RESAMPLE, DIALOG BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 365 - TOPMARGIN, 4 - BOTTOMMARGIN, 330 + LEFTMARGIN, 7 + RIGHTMARGIN, 190 + TOPMARGIN, 7 + BOTTOMMARGIN, 115 END - IDD_CHORDEDIT, DIALOG + IDD_WECLOME, DIALOG BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 317 - TOPMARGIN, 4 - BOTTOMMARGIN, 120 + LEFTMARGIN, 7 + RIGHTMARGIN, 250 + TOPMARGIN, 7 + BOTTOMMARGIN, 259 END - IDD_SPLASHSCREEN, DIALOG + IDD_UPDATE, DIALOG BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 189 + TOPMARGIN, 7 + BOTTOMMARGIN, 131 END - IDD_MOD2MIDI, DIALOG + IDD_TEMPO_SWING, DIALOG BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 263 - TOPMARGIN, 4 - BOTTOMMARGIN, 190 + LEFTMARGIN, 7 + RIGHTMARGIN, 239 + TOPMARGIN, 7 + BOTTOMMARGIN, 136 END - IDD_SAVEPRESET, DIALOG + IDD_LEGACY_PLAYBACK, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 147 - BOTTOMMARGIN, 52 + RIGHTMARGIN, 382 + TOPMARGIN, 7 + BOTTOMMARGIN, 237 END - IDD_EDITSAMPLEMAP, DIALOG + IDD_FIND_RANGE, DIALOG BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 283 - TOPMARGIN, 4 + LEFTMARGIN, 7 + RIGHTMARGIN, 249 + TOPMARGIN, 7 + BOTTOMMARGIN, 46 END - IDD_SELECTMIXPLUGIN, DIALOG + IDD_MIDI_IO_PLUGIN, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 246 + RIGHTMARGIN, 245 TOPMARGIN, 7 - BOTTOMMARGIN, 278 + BOTTOMMARGIN, 208 END - IDD_PLUGINEDITOR, DIALOG + IDD_OPTIONS_WINE, DIALOG BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 481 - TOPMARGIN, 4 - BOTTOMMARGIN, 149 + LEFTMARGIN, 7 + RIGHTMARGIN, 319 + TOPMARGIN, 7 + BOTTOMMARGIN, 304 END - IDD_EFFECTVISUALIZER, DIALOG + IDD_LFOPLUGIN, DIALOG BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 418 - TOPMARGIN, 3 - BOTTOMMARGIN, 104 + LEFTMARGIN, 7 + RIGHTMARGIN, 296 + TOPMARGIN, 7 + BOTTOMMARGIN, 194 END - IDD_PITCHSHIFT, DIALOG + IDD_OPL_PARAMS, DIALOG BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 403 + TOPMARGIN, 7 + BOTTOMMARGIN, 211 END - IDD_OPTIONS_AUTOSAVE, DIALOG + IDD_MISSINGPLUGS, DIALOG BEGIN - LEFTMARGIN, 6 - RIGHTMARGIN, 319 - TOPMARGIN, 6 - BOTTOMMARGIN, 306 + LEFTMARGIN, 7 + RIGHTMARGIN, 300 + TOPMARGIN, 7 + BOTTOMMARGIN, 163 END - IDD_EDIT_GOTO, DIALOG + IDD_MODIFIEDSAMPLES, DIALOG BEGIN - LEFTMARGIN, 6 - RIGHTMARGIN, 116 - TOPMARGIN, 4 - BOTTOMMARGIN, 117 + LEFTMARGIN, 7 + RIGHTMARGIN, 312 + TOPMARGIN, 7 + BOTTOMMARGIN, 178 END - IDD_ADDSILENCE, DIALOG + IDD_OPLEXPORT, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 188 + RIGHTMARGIN, 302 TOPMARGIN, 7 - BOTTOMMARGIN, 86 + BOTTOMMARGIN, 151 END - IDD_OPTIONS_MIXER, DIALOG + IDD_METRONOME_SETTINGS, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 318 + RIGHTMARGIN, 272 TOPMARGIN, 7 + BOTTOMMARGIN, 200 END - IDD_QUICKSTART, DIALOG + IDD_PATTERN_PROPERTIES, DIALOG BEGIN - LEFTMARGIN, 10 - RIGHTMARGIN, 321 - TOPMARGIN, 9 - BOTTOMMARGIN, 202 END END #endif // APSTUDIO_INVOKED @@ -2686,12 +2199,193 @@ // remains consistent on all systems. IDR_MAINFRAME ICON "res\\mptrack.ico" +IDR_MODULETYPE ICON "res\\moddoc.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// PNG +// + +IDB_ENVTOOLBAR PNG "res\\envelope_toolbar.png" + +IDB_IMAGELIST PNG "res\\icons.png" + +IDB_MAINBAR PNG "res\\main_toolbar.png" + +IDB_PATTERNS PNG "res\\pattern_toolbar.png" + +IDB_SMPTOOLBAR PNG "res\\sample_toolbar.png" + +IDB_SPLASHNOFOLDFIN PNG "res\\Splash.png" + +IDB_MPTRACK PNG "res\\About.png" + +IDB_NEW_BIG PNG "res\\New32.png" + +IDB_OPEN_BIG PNG "res\\Open32.png" + ///////////////////////////////////////////////////////////////////////////// // // AFX_DIALOG_LAYOUT // +IDD_MIDI_IO_PLUGIN AFX_DIALOG_LAYOUT +BEGIN + 0, + 0, 0, 100, 0, + 0, 0, 100, 0, + 0, 0, 100, 0, + 0, 0, 100, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 100, 100, + 0, 0, 100, 100, + 0, 100, 0, 0, + 100, 100, 0, 0, + 100, 100, 0, 0, + 0, 100, 100, 0, + 0, 100, 0, 0, + 0, 100, 100, 0 +END + +IDD_LFOPLUGIN AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_OPTIONS_SAMPLEEDITOR AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_OPTIONS_WINE AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_CLIPBOARD AFX_DIALOG_LAYOUT +BEGIN + 0, + 0, 0, 100, 100, + 0, 100, 0, 0, + 0, 100, 0, 0, + 0, 100, 0, 0, + 0, 100, 0, 0 +END + +IDD_OPL_PARAMS AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_CLOSEDOCUMENTS AFX_DIALOG_LAYOUT +BEGIN + 0, + 100, 100, 0, 0, + 100, 100, 0, 0, + 0, 0, 100, 100, + 0, 100, 0, 0, + 100, 100, 0, 0, + 100, 100, 0, 0 +END + +IDD_MISSINGPLUGS AFX_DIALOG_LAYOUT +BEGIN + 0, + 100, 100, 0, 0, + 0, 0, 0, 0, + 0, 0, 100, 100, + 100, 100, 0, 0 +END + +IDD_MISSINGSAMPLES AFX_DIALOG_LAYOUT +BEGIN + 0, + 100, 100, 0, 0, + 0, 0, 0, 0, + 0, 0, 100, 100, + 0, 100, 0, 0, + 0, 100, 100, 0 +END + +IDD_OPTIONS_UPDATE AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_WECLOME AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_LEGACY_PLAYBACK AFX_DIALOG_LAYOUT +BEGIN + 0, + 100, 100, 0, 0, + 100, 100, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 100, 0, + 0, 0, 100, 100, + 0, 100, 0, 0, + 0, 100, 0, 0 +END + +IDD_EDITHISTORY AFX_DIALOG_LAYOUT +BEGIN + 0, + 100, 100, 0, 0, + 0, 100, 0, 0, + 0, 0, 100, 100, + 0, 100, 100, 0 +END + +IDD_MODIFIEDSAMPLES AFX_DIALOG_LAYOUT +BEGIN + 0, + 100, 100, 0, 0, + 0, 0, 0, 0, + 0, 0, 100, 100, + 100, 100, 0, 0, + 100, 100, 0, 0, + 0, 100, 100, 0 +END + +IDD_UPDATE AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_CHANNELSETTINGS AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_RESAMPLE AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_OPLEXPORT AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_OPTIONS_ADVANCED AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_METRONOME_SETTINGS AFX_DIALOG_LAYOUT +BEGIN + 0 +END + IDD_MIDIMACRO AFX_DIALOG_LAYOUT BEGIN 0 |
From: <sv...@op...> - 2025-05-16 19:49:07
|
Author: sagamusix Date: Fri May 16 21:48:54 2025 New Revision: 23165 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23165 Log: Merged revision(s) 23164 from trunk/OpenMPT: [Imp] Comments tab: Allow to click anywhere in the sample / instrument list to select or open the corresponding editor (https://bugs.openmpt.org/view.php?id=1883). ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/view_com.cpp Modified: branches/OpenMPT-1.32/mptrack/view_com.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/view_com.cpp Fri May 16 21:47:31 2025 (r23164) +++ branches/OpenMPT-1.32/mptrack/view_com.cpp Fri May 16 21:48:54 2025 (r23165) @@ -134,6 +134,7 @@ m_ToolBar.Init(CMainFrame::GetMainFrame()->m_MiscIcons, CMainFrame::GetMainFrame()->m_MiscIconsDisabled); m_ItemList.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | LVS_REPORT | LVS_SINGLESEL | LVS_EDITLABELS | LVS_NOSORTHEADER, rect, this, IDC_LIST_DETAILS); m_ItemList.ModifyStyleEx(0, WS_EX_STATICEDGE); + m_ItemList.SetExtendedStyle(m_ItemList.GetExtendedStyle() | LVS_EX_FULLROWSELECT); // Add ToolBar Buttons m_ToolBar.AddButton(IDC_LIST_SAMPLES, IMAGE_SAMPLES); |
From: <sv...@op...> - 2025-05-16 19:47:48
|
Author: sagamusix Date: Fri May 16 21:47:31 2025 New Revision: 23164 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23164 Log: [Imp] Comments tab: Allow to click anywhere in the sample / instrument list to select or open the corresponding editor (https://bugs.openmpt.org/view.php?id=1883). Modified: trunk/OpenMPT/mptrack/view_com.cpp Modified: trunk/OpenMPT/mptrack/view_com.cpp ============================================================================== --- trunk/OpenMPT/mptrack/view_com.cpp Thu May 8 11:52:08 2025 (r23163) +++ trunk/OpenMPT/mptrack/view_com.cpp Fri May 16 21:47:31 2025 (r23164) @@ -134,6 +134,7 @@ m_ToolBar.Init(CMainFrame::GetMainFrame()->m_MiscIcons, CMainFrame::GetMainFrame()->m_MiscIconsDisabled); m_ItemList.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | LVS_REPORT | LVS_SINGLESEL | LVS_EDITLABELS | LVS_NOSORTHEADER, rect, this, IDC_LIST_DETAILS); m_ItemList.ModifyStyleEx(0, WS_EX_STATICEDGE); + m_ItemList.SetExtendedStyle(m_ItemList.GetExtendedStyle() | LVS_EX_FULLROWSELECT); // Add ToolBar Buttons m_ToolBar.AddButton(IDC_LIST_SAMPLES, IMAGE_SAMPLES); |
From: <sv...@op...> - 2025-05-08 09:52:15
|
Author: sagamusix Date: Thu May 8 11:52:08 2025 New Revision: 23163 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23163 Log: Merged revision(s) 23162 from trunk/OpenMPT: [Fix] MOD: Automatic hiding of volume column was broken (https://bugs.openmpt.org/view.php?id=1884). ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/soundlib/Load_mod.cpp branches/OpenMPT-1.32/test/test.cpp Modified: branches/OpenMPT-1.32/soundlib/Load_mod.cpp ============================================================================== --- branches/OpenMPT-1.32/soundlib/Load_mod.cpp Thu May 8 11:50:39 2025 (r23162) +++ branches/OpenMPT-1.32/soundlib/Load_mod.cpp Thu May 8 11:52:08 2025 (r23163) @@ -298,7 +298,6 @@ } InitializeGlobals(MOD_TYPE_MOD, modMagicResult.numChannels); - m_SongFlags.set(SONG_FORMAT_NO_VOLCOL); bool isNoiseTracker = modMagicResult.isNoiseTracker; bool isStartrekker = modMagicResult.isStartrekker; @@ -432,7 +431,7 @@ // is the maximum possible sample pre-amp without getting distortion (Compatible mix levels given). // The more channels we have, the less likely it is that all of them are used at the same time, though, so cap at 32... m_nSamplePreAmp = Clamp(256 / GetNumChannels(), 32, 128); - m_SongFlags.reset(); // SONG_ISAMIGA will be set conditionally + m_SongFlags = SONG_FORMAT_NO_VOLCOL; // SONG_ISAMIGA will be set conditionally // Setup channel pan positions and volume SetupMODPanning(); Modified: branches/OpenMPT-1.32/test/test.cpp ============================================================================== --- branches/OpenMPT-1.32/test/test.cpp Thu May 8 11:50:39 2025 (r23162) +++ branches/OpenMPT-1.32/test/test.cpp Thu May 8 11:52:08 2025 (r23163) @@ -3473,7 +3473,7 @@ { // Global Variables VERIFY_EQUAL_NONCONT(sndFile.GetTitle(), "MOD_Test___________X"); - VERIFY_EQUAL_NONCONT(sndFile.m_SongFlags, SONG_PT_MODE | SONG_AMIGALIMITS | SONG_ISAMIGA); + VERIFY_EQUAL_NONCONT(sndFile.m_SongFlags, SONG_PT_MODE | SONG_AMIGALIMITS | SONG_ISAMIGA | SONG_FORMAT_NO_VOLCOL); VERIFY_EQUAL_NONCONT(sndFile.GetMixLevels(), MixLevels::Compatible); VERIFY_EQUAL_NONCONT(sndFile.m_nTempoMode, TempoMode::Classic); VERIFY_EQUAL_NONCONT(sndFile.GetNumChannels(), 4); |
From: <sv...@op...> - 2025-05-08 09:50:53
|
Author: sagamusix Date: Thu May 8 11:50:39 2025 New Revision: 23162 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23162 Log: [Fix] MOD: Automatic hiding of volume column was broken (https://bugs.openmpt.org/view.php?id=1884). Modified: trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/test/test.cpp Modified: trunk/OpenMPT/soundlib/Load_mod.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp Sun May 4 20:45:19 2025 (r23161) +++ trunk/OpenMPT/soundlib/Load_mod.cpp Thu May 8 11:50:39 2025 (r23162) @@ -298,7 +298,6 @@ } InitializeGlobals(MOD_TYPE_MOD, modMagicResult.numChannels); - m_SongFlags.set(SONG_FORMAT_NO_VOLCOL); bool isNoiseTracker = modMagicResult.isNoiseTracker; bool isStartrekker = modMagicResult.isStartrekker; @@ -432,7 +431,7 @@ // is the maximum possible sample pre-amp without getting distortion (Compatible mix levels given). // The more channels we have, the less likely it is that all of them are used at the same time, though, so cap at 32... m_nSamplePreAmp = Clamp(256 / GetNumChannels(), 32, 128); - m_SongFlags.reset(); // SONG_ISAMIGA will be set conditionally + m_SongFlags = SONG_FORMAT_NO_VOLCOL; // SONG_ISAMIGA will be set conditionally // Setup channel pan positions and volume SetupMODPanning(); Modified: trunk/OpenMPT/test/test.cpp ============================================================================== --- trunk/OpenMPT/test/test.cpp Sun May 4 20:45:19 2025 (r23161) +++ trunk/OpenMPT/test/test.cpp Thu May 8 11:50:39 2025 (r23162) @@ -3473,7 +3473,7 @@ { // Global Variables VERIFY_EQUAL_NONCONT(sndFile.GetTitle(), "MOD_Test___________X"); - VERIFY_EQUAL_NONCONT(sndFile.m_SongFlags, SONG_PT_MODE | SONG_AMIGALIMITS | SONG_ISAMIGA); + VERIFY_EQUAL_NONCONT(sndFile.m_SongFlags, SONG_PT_MODE | SONG_AMIGALIMITS | SONG_ISAMIGA | SONG_FORMAT_NO_VOLCOL); VERIFY_EQUAL_NONCONT(sndFile.GetMixLevels(), MixLevels::Compatible); VERIFY_EQUAL_NONCONT(sndFile.m_nTempoMode, TempoMode::Classic); VERIFY_EQUAL_NONCONT(sndFile.GetNumChannels(), 4); |
From: <sv...@op...> - 2025-05-04 18:45:42
|
Author: sagamusix Date: Sun May 4 20:45:19 2025 New Revision: 23161 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23161 Log: Merged revision(s) 23160 from trunk/OpenMPT: [Imp] It is now possible in the Pattern Properties dialog to edit the properties of multiple patterns without having to close and re-open the dialog every time, and also change their names (https://forum.openmpt.org/index.php?topic=3454.0). ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.cpp branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.h branches/OpenMPT-1.32/mptrack/View_pat.cpp branches/OpenMPT-1.32/mptrack/mptrack.rc branches/OpenMPT-1.32/soundlib/pattern.cpp branches/OpenMPT-1.32/soundlib/pattern.h Modified: branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.cpp Sun May 4 20:42:24 2025 (r23160) +++ branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.cpp Sun May 4 20:45:19 2025 (r23161) @@ -127,16 +127,29 @@ // CPatternPropertiesDlg BEGIN_MESSAGE_MAP(CPatternPropertiesDlg, DialogBase) - ON_COMMAND(IDC_BUTTON_HALF, &CPatternPropertiesDlg::OnHalfRowNumber) - ON_COMMAND(IDC_BUTTON_DOUBLE, &CPatternPropertiesDlg::OnDoubleRowNumber) - ON_COMMAND(IDC_CHECK1, &CPatternPropertiesDlg::OnOverrideSignature) - ON_COMMAND(IDC_BUTTON1, &CPatternPropertiesDlg::OnTempoSwing) + ON_WM_VSCROLL() + ON_COMMAND(IDC_BUTTON_HALF, &CPatternPropertiesDlg::OnHalfRowNumber) + ON_COMMAND(IDC_BUTTON_DOUBLE, &CPatternPropertiesDlg::OnDoubleRowNumber) + ON_COMMAND(IDC_CHECK1, &CPatternPropertiesDlg::OnOverrideSignature) + ON_COMMAND(IDC_BUTTON1, &CPatternPropertiesDlg::OnTempoSwing) + ON_EN_CHANGE(IDC_EDIT1, &CPatternPropertiesDlg::OnPatternChanged) END_MESSAGE_MAP() +void CPatternPropertiesDlg::DoDataExchange(CDataExchange *pDX) +{ + DialogBase::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CPatternPropertiesDlg) + DDX_Control(pDX, IDC_COMBO1, m_numRows); + DDX_Control(pDX, IDC_SPIN1, m_spinPattern); + DDX_Control(pDX, IDC_SPIN2, m_spinRPB); + DDX_Control(pDX, IDC_SPIN3, m_spinRPM); + //}}AFX_DATA_MAP +} + CPatternPropertiesDlg::CPatternPropertiesDlg(CModDoc &modParent, PATTERNINDEX nPat, CWnd *parent) : DialogBase{IDD_PATTERN_PROPERTIES, parent} - , modDoc{modParent} + , m_modDoc{modParent} , m_nPattern{nPat} { } @@ -144,38 +157,54 @@ BOOL CPatternPropertiesDlg::OnInitDialog() { - CComboBox *combo; DialogBase::OnInitDialog(); - combo = (CComboBox *)GetDlgItem(IDC_COMBO1); - const CSoundFile &sndFile = modDoc.GetSoundFile(); - if(m_nPattern < sndFile.Patterns.Size() && combo) + const CSoundFile &sndFile = m_modDoc.GetSoundFile(); + const CModSpecifications &specs = sndFile.GetModSpecifications(); + m_numRows.SetRedraw(FALSE); + for(ROWINDEX irow = specs.patternRowsMin; irow <= specs.patternRowsMax; irow++) { - CString s; - const CPattern &pattern = sndFile.Patterns[m_nPattern]; - ROWINDEX nrows = pattern.GetNumRows(); + m_numRows.AddString(mpt::cfmt::dec(irow)); + } + m_numRows.SetRedraw(TRUE); + m_numRows.SetFocus(); + m_spinRPB.SetRange32(1, MAX_ROWS_PER_BEAT); + m_spinRPM.SetRange32(1, MAX_ROWS_PER_MEASURE); + m_spinPattern.SetRange32(-1, 1); + SetDlgItemInt(IDC_EDIT1, m_nPattern); + CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO2); + static_cast<CEdit *>(GetDlgItem(IDC_EDIT2))->SetLimitText(MAX_PATTERNNAME - 1); - const CModSpecifications &specs = sndFile.GetModSpecifications(); - combo->SetRedraw(FALSE); - for(UINT irow = specs.patternRowsMin; irow <= specs.patternRowsMax; irow++) - { - combo->AddString(mpt::cfmt::dec(irow)); - } - combo->SetCurSel(nrows - specs.patternRowsMin); - combo->SetRedraw(TRUE); + m_locked = false; + SetCurrentPattern(m_nPattern); + + return FALSE; +} - CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO2); - s = MPT_CFORMAT("Pattern #{}: {} row{} ({}K)")( - m_nPattern, - pattern.GetNumRows(), - (pattern.GetNumRows() == 1) ? CString(_T("")) : CString(_T("s")), - static_cast<int>((pattern.GetNumRows() * sndFile.GetNumChannels() * sizeof(ModCommand)) / 1024)); - SetDlgItemText(IDC_TEXT1, s); +void CPatternPropertiesDlg::SetCurrentPattern(PATTERNINDEX pat) +{ + if(m_locked) + return; + const CSoundFile &sndFile = m_modDoc.GetSoundFile(); + const bool validPat = sndFile.Patterns.IsValidPat(pat); + + for(auto id : { IDC_EDIT2, IDC_COMBO1, IDC_BUTTON_HALF, IDC_BUTTON_DOUBLE, IDC_RADIO1, IDC_RADIO2, IDC_CHECK2, IDC_BUTTON1, IDC_ROWSPERBEAT, IDC_ROWSPERMEASURE, IDC_SPIN2, IDC_SPIN3 }) + { + GetDlgItem(id)->EnableWindow(validPat ? TRUE : FALSE); + } + GetDlgItem(IDC_CHECK1)->EnableWindow((sndFile.GetModSpecifications().hasPatternSignatures && validPat) ? TRUE : FALSE); + if(validPat) + { + m_nPattern = pat; + PatternProperties &prop = GetPatternProperties(); + m_numRows.SetCurSel(prop.numRows - sndFile.GetModSpecifications().patternRowsMin); + CheckRadioButton(IDC_RADIO1, IDC_RADIO2, prop.resizeAtEnd ? IDC_RADIO2 : IDC_RADIO1); // Window title - const CString patternName = mpt::ToCString(sndFile.GetCharsetInternal(), pattern.GetName()); - s = MPT_CFORMAT("Pattern Properties for Pattern #{}")(m_nPattern); + const CString patternName = mpt::ToCString(sndFile.GetCharsetInternal(), prop.name); + SetDlgItemText(IDC_EDIT2, patternName); + CString s = MPT_CFORMAT("Pattern Properties for Pattern #{}")(m_nPattern); if(!patternName.IsEmpty()) { s += _T(" ("); @@ -185,30 +214,161 @@ SetWindowText(s); // Pattern time signature - const bool bOverride = pattern.GetOverrideSignature(); - ROWINDEX nRPB = pattern.GetRowsPerBeat(), nRPM = pattern.GetRowsPerMeasure(); - if(nRPB == 0 || !bOverride) - nRPB = sndFile.m_nDefaultRowsPerBeat; - if(nRPM == 0 || !bOverride) - nRPM = sndFile.m_nDefaultRowsPerMeasure; - - m_tempoSwing = pattern.HasTempoSwing() ? pattern.GetTempoSwing() : sndFile.m_tempoSwing; - - GetDlgItem(IDC_CHECK1)->EnableWindow(sndFile.GetModSpecifications().hasPatternSignatures ? TRUE : FALSE); - CheckDlgButton(IDC_CHECK1, bOverride ? BST_CHECKED : BST_UNCHECKED); - SetDlgItemInt(IDC_ROWSPERBEAT, nRPB, FALSE); - SetDlgItemInt(IDC_ROWSPERMEASURE, nRPM, FALSE); + const bool overrideSignature = prop.rowsPerBeat != 0 || prop.rowsPerMeasure != 0; + ROWINDEX rpb = prop.rowsPerBeat, rpm = prop.rowsPerMeasure; + if(rpb == 0 || !overrideSignature) + rpb = sndFile.m_nDefaultRowsPerBeat; + if(rpm == 0 || !overrideSignature) + rpm = sndFile.m_nDefaultRowsPerMeasure; + + CheckDlgButton(IDC_CHECK1, overrideSignature ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(IDC_CHECK2, prop.repeatContents ? BST_CHECKED : BST_UNCHECKED); + SetDlgItemInt(IDC_ROWSPERBEAT, rpb, FALSE); + SetDlgItemInt(IDC_ROWSPERMEASURE, rpm, FALSE); OnOverrideSignature(); + } else + { + MessageBeep(MB_ICONWARNING); } - return TRUE; +} + + +void CPatternPropertiesDlg::StorePatternProperties() +{ + if(m_locked) + return; + auto &prop = GetPatternProperties(); + CString str; + GetDlgItemText(IDC_EDIT2, str); + prop.name = mpt::ToCharset(m_modDoc.GetSoundFile().GetCharsetInternal(), str); + prop.numRows = GetDlgItemInt(IDC_COMBO1); + prop.resizeAtEnd = IsDlgButtonChecked(IDC_RADIO2) != BST_UNCHECKED; + prop.repeatContents = IsDlgButtonChecked(IDC_CHECK2) != BST_UNCHECKED; + if(IsDlgButtonChecked(IDC_CHECK1) != BST_UNCHECKED) + { + prop.rowsPerBeat = GetDlgItemInt(IDC_ROWSPERBEAT); + prop.rowsPerMeasure = GetDlgItemInt(IDC_ROWSPERMEASURE); + } else + { + prop.rowsPerBeat = prop.rowsPerMeasure = 0; + } +} + + +bool CPatternPropertiesDlg::ValidatePatternProperties() +{ + StorePatternProperties(); + + CSoundFile &sndFile = m_modDoc.GetSoundFile(); + auto &prop = GetPatternProperties(); + // Check for valid time signatures + if((prop.rowsPerBeat != 0 || prop.rowsPerMeasure != 0) && !CPattern::IsValidSignature(prop.rowsPerBeat, prop.rowsPerMeasure)) + { + Reporting::Error("Invalid time signature!", "Pattern Properties"); + SetCurrentPattern(m_nPattern); + SetDlgItemInt(IDC_EDIT1, m_nPattern); + GetDlgItem(IDC_ROWSPERBEAT)->SetFocus(); + return false; + } + + // Check if any pattern data would be removed. + CPattern &pattern = sndFile.Patterns[m_nPattern]; + const ROWINDEX newSize = prop.numRows; + const ROWINDEX oldSize = pattern.GetNumRows(); + if(pattern.IsValid() && newSize < oldSize + && (prop.resizeWarningShown != newSize || prop.resizeWarningAtEnd != prop.resizeAtEnd)) + { + ROWINDEX firstRow = prop.resizeAtEnd ? newSize : 0; + ROWINDEX lastRow = prop.resizeAtEnd ? oldSize : oldSize - newSize; + for(ROWINDEX row = firstRow; row < lastRow; row++) + { + if(!pattern.IsEmptyRow(row)) + { + bool resize = (Reporting::Confirm(MPT_AFORMAT("Data at the {} of pattern {} will be lost.\nDo you want to continue?")(prop.resizeAtEnd ? "end" : "start", m_nPattern), "Shrink Pattern") == cnfYes); + if(!resize) + { + SetCurrentPattern(m_nPattern); + SetDlgItemInt(IDC_EDIT1, m_nPattern); + m_numRows.SetFocus(); + return false; + } + break; + } + } + prop.resizeWarningShown = prop.numRows; + prop.resizeWarningAtEnd = prop.resizeAtEnd; + } + return true; +} + + +void CPatternPropertiesDlg::OnPatternChanged() +{ + auto pat = GetDlgItemInt(IDC_EDIT1); + if(m_locked || pat == m_nPattern) + return; + if(!ValidatePatternProperties()) + return; + SetCurrentPattern(mpt::saturate_cast<PATTERNINDEX>(pat)); +} + + +void CPatternPropertiesDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) +{ + DialogBase::OnVScroll(nSBCode, nPos, pScrollBar); + + const int direction = m_spinPattern.GetPos32(); + const auto &patterns = m_modDoc.GetSoundFile().Patterns; + if(!direction || !patterns.IsValidPat(m_nPattern)) + return; + int pattern = std::clamp(static_cast<int>(GetDlgItemInt(IDC_EDIT1)), 0, patterns.Size() - 1); + const int startPattern = pattern; + do + { + pattern += direction; + if(pattern < 0) + pattern = patterns.Size() - 1; + else if(pattern >= patterns.Size()) + pattern = 0; + else if(pattern == startPattern) + break; // Couldn't find any other pattern, abort + } while(!patterns.IsValidPat(static_cast<PATTERNINDEX>(pattern))); + m_spinPattern.SetPos32(0); + SetDlgItemInt(IDC_EDIT1, static_cast<PATTERNINDEX>(pattern)); +} + + +CPatternPropertiesDlg::PatternProperties& CPatternPropertiesDlg::GetPatternProperties(PATTERNINDEX pat) +{ + if(auto p = m_properties.find(pat); p != m_properties.end()) + return p->second; + + const CSoundFile &sndFile = m_modDoc.GetSoundFile(); + PatternProperties prop; + if(sndFile.Patterns.IsValidPat(pat)) + { + const CPattern &pattern = sndFile.Patterns[pat]; + prop.name = pattern.GetName(); + if(pattern.HasTempoSwing()) + prop.tempoSwing = pattern.GetTempoSwing(); + else + prop.tempoSwing = sndFile.m_tempoSwing; + prop.numRows = pattern.GetNumRows(); + prop.rowsPerBeat = pattern.GetRowsPerBeat(); + prop.rowsPerMeasure = pattern.GetRowsPerMeasure(); + } + // Take whatever was selected for the previous pattern to be the default for this newly-edited pattern as well + prop.resizeAtEnd = IsDlgButtonChecked(IDC_RADIO2) != BST_UNCHECKED; + prop.repeatContents = IsDlgButtonChecked(IDC_CHECK2) != BST_UNCHECKED; + return m_properties.insert(std::make_pair(pat, std::move(prop))).first->second; } void CPatternPropertiesDlg::OnHalfRowNumber() { - const CSoundFile &sndFile = modDoc.GetSoundFile(); + const CSoundFile &sndFile = m_modDoc.GetSoundFile(); - UINT nRows = GetDlgItemInt(IDC_COMBO1, NULL, FALSE); + UINT nRows = GetDlgItemInt(IDC_COMBO1, nullptr, FALSE); nRows /= 2; if(nRows < sndFile.GetModSpecifications().patternRowsMin) nRows = sndFile.GetModSpecifications().patternRowsMin; @@ -218,9 +378,9 @@ void CPatternPropertiesDlg::OnDoubleRowNumber() { - const CSoundFile &sndFile = modDoc.GetSoundFile(); + const CSoundFile &sndFile = m_modDoc.GetSoundFile(); - UINT nRows = GetDlgItemInt(IDC_COMBO1, NULL, FALSE); + UINT nRows = GetDlgItemInt(IDC_COMBO1, nullptr, FALSE); nRows *= 2; if(nRows > sndFile.GetModSpecifications().patternRowsMax) nRows = sndFile.GetModSpecifications().patternRowsMax; @@ -230,15 +390,16 @@ void CPatternPropertiesDlg::OnOverrideSignature() { - GetDlgItem(IDC_ROWSPERBEAT)->EnableWindow(IsDlgButtonChecked(IDC_CHECK1)); - GetDlgItem(IDC_ROWSPERMEASURE)->EnableWindow(IsDlgButtonChecked(IDC_CHECK1)); - GetDlgItem(IDC_BUTTON1)->EnableWindow(IsDlgButtonChecked(IDC_CHECK1) && modDoc.GetSoundFile().m_nTempoMode == TempoMode::Modern); + const BOOL enableTimeSignature = IsDlgButtonChecked(IDC_CHECK1); + GetDlgItem(IDC_ROWSPERBEAT)->EnableWindow(enableTimeSignature); + GetDlgItem(IDC_ROWSPERMEASURE)->EnableWindow(enableTimeSignature); + GetDlgItem(IDC_BUTTON1)->EnableWindow(enableTimeSignature && m_modDoc.GetSoundFile().m_nTempoMode == TempoMode::Modern); } void CPatternPropertiesDlg::OnTempoSwing() { - CPattern &pat = modDoc.GetSoundFile().Patterns[m_nPattern]; + CPattern &pat = m_modDoc.GetSoundFile().Patterns[m_nPattern]; const ROWINDEX oldRPB = pat.GetRowsPerBeat(); const ROWINDEX oldRPM = pat.GetRowsPerMeasure(); @@ -247,11 +408,12 @@ const ROWINDEX newRPM = std::clamp(static_cast<ROWINDEX>(GetDlgItemInt(IDC_ROWSPERMEASURE)), newRPB, MAX_ROWS_PER_BEAT); pat.SetSignature(newRPB, newRPM); - m_tempoSwing.resize(newRPB, TempoSwing::Unity); - CTempoSwingDlg dlg(this, m_tempoSwing, modDoc.GetSoundFile(), m_nPattern); + TempoSwing &tempoSwing = GetPatternProperties().tempoSwing; + tempoSwing.resize(newRPB, TempoSwing::Unity); + CTempoSwingDlg dlg(this, tempoSwing, m_modDoc.GetSoundFile(), m_nPattern); if(dlg.DoModal() == IDOK) { - m_tempoSwing = dlg.m_tempoSwing; + tempoSwing = dlg.m_tempoSwing; } pat.SetSignature(oldRPB, oldRPM); } @@ -259,87 +421,91 @@ void CPatternPropertiesDlg::OnOK() { - CSoundFile &sndFile = modDoc.GetSoundFile(); - CPattern &pattern = sndFile.Patterns[m_nPattern]; - // Update pattern signature if necessary - if(sndFile.GetModSpecifications().hasPatternSignatures) + if(!ValidatePatternProperties()) + return; + + CSoundFile &sndFile = m_modDoc.GetSoundFile(); + bool modified = false; + for(const auto &[pat, prop] : m_properties) { - if(IsDlgButtonChecked(IDC_CHECK1)) - { - // Enable signature - const ROWINDEX newRPB = std::min(static_cast<ROWINDEX>(GetDlgItemInt(IDC_ROWSPERBEAT, NULL, FALSE)), MAX_ROWS_PER_BEAT); - const ROWINDEX newRPM = std::min(static_cast<ROWINDEX>(GetDlgItemInt(IDC_ROWSPERMEASURE, NULL, FALSE)), MAX_ROWS_PER_BEAT); + PatternHint updateHint = PatternHint{pat}; - if(newRPB != pattern.GetRowsPerBeat() || newRPM != pattern.GetRowsPerMeasure() || m_tempoSwing != pattern.GetTempoSwing()) + CPattern &pattern = sndFile.Patterns[pat]; + // Update pattern signature if necessary + if(sndFile.GetModSpecifications().hasPatternSignatures) + { + if(prop.rowsPerBeat != 0 || prop.rowsPerMeasure != 0) { - if(!pattern.SetSignature(newRPB, newRPM)) + // Enable signature + const ROWINDEX newRPB = prop.rowsPerBeat; + const ROWINDEX newRPM = prop.rowsPerMeasure; + TempoSwing tempoSwing = prop.tempoSwing; + if(newRPB != pattern.GetRowsPerBeat() || newRPM != pattern.GetRowsPerMeasure() || tempoSwing != pattern.GetTempoSwing()) { - Reporting::Error("Invalid time signature!", "Pattern Properties"); - GetDlgItem(IDC_ROWSPERBEAT)->SetFocus(); - return; + pattern.SetSignature(newRPB, newRPM); + tempoSwing.resize(newRPB, TempoSwing::Unity); + pattern.SetTempoSwing(tempoSwing); + updateHint.Data(); } - m_tempoSwing.resize(newRPB, TempoSwing::Unity); - pattern.SetTempoSwing(m_tempoSwing); - modDoc.SetModified(); - } - } else - { - // Disable signature - if(pattern.GetOverrideSignature() || pattern.HasTempoSwing()) + } else { - pattern.RemoveSignature(); - pattern.RemoveTempoSwing(); - modDoc.SetModified(); + // Disable signature + if(pattern.GetOverrideSignature() || pattern.HasTempoSwing()) + { + pattern.RemoveSignature(); + pattern.RemoveTempoSwing(); + updateHint.Data(); + } } } - } - - const ROWINDEX newSize = (ROWINDEX)GetDlgItemInt(IDC_COMBO1, NULL, FALSE); + const ROWINDEX newSize = prop.numRows; - // Check if any pattern data would be removed. - const ROWINDEX oldSize = pattern.GetNumRows(); - bool resize = newSize != oldSize; - const bool resizeAtEnd = IsDlgButtonChecked(IDC_RADIO2) != BST_UNCHECKED; - if(newSize < pattern.GetNumRows()) - { - ROWINDEX firstRow = resizeAtEnd ? newSize : 0; - ROWINDEX lastRow = resizeAtEnd ? oldSize : oldSize - newSize; - for(ROWINDEX row = firstRow; row < lastRow; row++) - { - if(!pattern.IsEmptyRow(row)) + // Check if any pattern data would be removed. + const ROWINDEX oldSize = pattern.GetNumRows(); + bool resize = newSize != oldSize; + const bool resizeAtEnd = prop.resizeAtEnd; + if(resize) + { + const bool copyContents = (newSize > oldSize) && prop.repeatContents; + m_modDoc.BeginWaitCursor(); + m_modDoc.GetPatternUndo().PrepareUndo(m_nPattern, 0, 0, sndFile.Patterns[m_nPattern].GetNumChannels(), oldSize, "Resize"); + if(sndFile.Patterns[m_nPattern].Resize(newSize, true, resizeAtEnd)) { - resize = (Reporting::Confirm(MPT_AFORMAT("Data at the {} of the pattern will be lost.\nDo you want to continue?")(resizeAtEnd ? "end" : "start"), "Shrink Pattern") == cnfYes); - break; + if(copyContents) + { + const ROWINDEX copyRows = newSize - oldSize; + const ROWINDEX sourceBaseRow = resizeAtEnd ? 0 : copyRows; + const ROWINDEX baseOffset = resizeAtEnd ? 0 : (oldSize - copyRows % oldSize); + ROWINDEX destRow = resizeAtEnd ? oldSize : 0; + for(ROWINDEX row = 0; row < copyRows; row++, destRow++) + { + ROWINDEX sourceRow = sourceBaseRow + (baseOffset + row) % oldSize; + const auto sourceRowData = pattern.GetRow(sourceRow); + auto destRowData = pattern.GetRow(destRow); + std::copy(sourceRowData.begin(), sourceRowData.end(), destRowData.begin()); + } + } + updateHint.Data(); } + m_modDoc.EndWaitCursor(); + } + if(pattern.GetName() != prop.name) + { + pattern.SetName(prop.name); + updateHint.Names(); } - } - if(resize) - { - const bool copyContents = (newSize > oldSize) && IsDlgButtonChecked(IDC_CHECK2) != BST_UNCHECKED; - modDoc.BeginWaitCursor(); - modDoc.GetPatternUndo().PrepareUndo(m_nPattern, 0, 0, sndFile.Patterns[m_nPattern].GetNumChannels(), oldSize, "Resize"); - if(sndFile.Patterns[m_nPattern].Resize(newSize, true, resizeAtEnd)) + if(updateHint.GetType() != HINT_NONE) { - if(copyContents) - { - const ROWINDEX copyRows = newSize - oldSize; - const ROWINDEX sourceBaseRow = resizeAtEnd ? 0 : copyRows; - const ROWINDEX baseOffset = resizeAtEnd ? 0 : (oldSize - copyRows % oldSize); - ROWINDEX destRow = resizeAtEnd ? oldSize : 0; - for(ROWINDEX row = 0; row < copyRows; row++, destRow++) - { - ROWINDEX sourceRow = sourceBaseRow + (baseOffset + row) % oldSize; - const auto sourceRowData = pattern.GetRow(sourceRow); - auto destRowData = pattern.GetRow(destRow); - std::copy(sourceRowData.begin(), sourceRowData.end(), destRowData.begin()); - } - } - modDoc.SetModified(); + m_modDoc.UpdateAllViews(nullptr, updateHint, this); + modified = true; } - modDoc.EndWaitCursor(); } + + if(modified) + m_modDoc.SetModified(); + DialogBase::OnOK(); } @@ -363,7 +529,7 @@ void CEditCommand::DoDataExchange(CDataExchange* pDX) { DialogBase::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CSplitKeyboadSettings) + //{{AFX_DATA_MAP(CEditCommand) DDX_Control(pDX, IDC_COMBO1, cbnNote); DDX_Control(pDX, IDC_COMBO2, cbnInstr); DDX_Control(pDX, IDC_COMBO3, cbnVolCmd); @@ -1700,7 +1866,7 @@ cmd = kcChnColorFromNext; break; } - + if(cmd != kcNull) { auto keyText = CMainFrame::GetInputHandler()->m_activeCommandSet->GetKeyTextFromCommand(cmd, 0); Modified: branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.h ============================================================================== --- branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.h Sun May 4 20:42:24 2025 (r23160) +++ branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.h Sun May 4 20:45:19 2025 (r23161) @@ -28,22 +28,45 @@ class CPatternPropertiesDlg : public DialogBase { -protected: - CModDoc &modDoc; - TempoSwing m_tempoSwing; - PATTERNINDEX m_nPattern; - public: CPatternPropertiesDlg(CModDoc &modParent, PATTERNINDEX nPat, CWnd *parent = nullptr); protected: + void DoDataExchange(CDataExchange *pDX) override; BOOL OnInitDialog() override; void OnOK() override; + afx_msg void OnHalfRowNumber(); afx_msg void OnDoubleRowNumber(); afx_msg void OnOverrideSignature(); afx_msg void OnTempoSwing(); + afx_msg void OnPatternChanged(); + afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar); + DECLARE_MESSAGE_MAP() + + struct PatternProperties + { + std::string name; + TempoSwing tempoSwing; + ROWINDEX numRows = 0, rowsPerBeat = 0, rowsPerMeasure = 0; + ROWINDEX resizeWarningShown = 0; + bool resizeWarningAtEnd = false; + bool resizeAtEnd = true, repeatContents = false; + }; + + PatternProperties& GetPatternProperties(PATTERNINDEX pat); + PatternProperties& GetPatternProperties() { return GetPatternProperties(m_nPattern); } + void StorePatternProperties(); + void SetCurrentPattern(PATTERNINDEX pat); + bool ValidatePatternProperties(); + + CModDoc &m_modDoc; + std::map<PATTERNINDEX, PatternProperties> m_properties; + PATTERNINDEX m_nPattern; + CSpinButtonCtrl m_spinPattern, m_spinRPB, m_spinRPM; + CComboBox m_numRows; + bool m_locked = true; }; @@ -115,7 +138,7 @@ CComboBox m_CbnShortcut, m_CbnBaseNote, m_CbnNote[MPTChord::notesPerChord - 1]; MPTChords m_chords; MPTChord::NoteType m_mouseDownKey = MPTChord::noNote, m_dragKey = MPTChord::noNote; - + static constexpr MPTChord::NoteType CHORD_MIN = -24; static constexpr MPTChord::NoteType CHORD_MAX = 24; Modified: branches/OpenMPT-1.32/mptrack/View_pat.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/View_pat.cpp Sun May 4 20:42:24 2025 (r23160) +++ branches/OpenMPT-1.32/mptrack/View_pat.cpp Sun May 4 20:45:19 2025 (r23161) @@ -1410,7 +1410,6 @@ UpdateScrollSize(); InvalidatePattern(true, true); SanitizeCursor(); - pModDoc->UpdateAllViews(this, PatternHint(pat).Data(), this); } } } Modified: branches/OpenMPT-1.32/mptrack/mptrack.rc ============================================================================== --- branches/OpenMPT-1.32/mptrack/mptrack.rc Sun May 4 20:42:24 2025 (r23160) +++ branches/OpenMPT-1.32/mptrack/mptrack.rc Sun May 4 20:45:19 2025 (r23161) @@ -13,10 +13,10 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// German (Germany) resources +// English (United States) resources -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) -LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) ///////////////////////////////////////////////////////////////////////////// @@ -1915,31 +1915,37 @@ CONTROL "Replace &All (No confirmation)",IDC_CHECK8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,126,186,10 END -IDD_PATTERN_PROPERTIES DIALOGEX 0, 0, 191, 170 +IDD_PATTERN_PROPERTIES DIALOGEX 0, 0, 195, 194 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Pattern Properties" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - LTEXT "&Rows:",IDC_STATIC,6,6,108,8 - COMBOBOX IDC_COMBO1,6,18,48,93,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&/2",IDC_BUTTON_HALF,60,18,18,12 - PUSHBUTTON "&x2",IDC_BUTTON_DOUBLE,84,18,18,12 - LTEXT "Remove rows from / Add rows at:",IDC_STATIC,6,36,126,8 - CONTROL "&Top of Pattern",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,6,48,84,12 - CONTROL "&Bottom of Pattern",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,90,48,84,12 + LTEXT "Pattern:",IDC_STATIC,6,8,36,8 + EDITTEXT IDC_EDIT1,42,6,40,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN1,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,84,6,11,14 + LTEXT "Name:",IDC_STATIC,6,26,36,8 + EDITTEXT IDC_EDIT2,42,24,84,12,ES_AUTOHSCROLL + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,48,184,1 + LTEXT "&Rows:",IDC_STATIC,12,54,108,8 + COMBOBOX IDC_COMBO1,12,66,48,93,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "&/2",IDC_BUTTON_HALF,66,66,18,12 + PUSHBUTTON "&x2",IDC_BUTTON_DOUBLE,90,66,18,12 + LTEXT "Remove rows from / Add rows at:",IDC_STATIC,12,84,126,8 + CONTROL "&Top of Pattern",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,12,96,84,12 + CONTROL "&Bottom of Pattern",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,96,96,84,12 CONTROL "Repeat pattern contents when &adding rows",IDC_CHECK2, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,66,168,10 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,84,174,1 - CONTROL "Override &song signature:",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,90,108,12 - PUSHBUTTON "Configure S&wing",IDC_BUTTON1,114,90,66,12 - LTEXT "Rows per b&eat",IDC_STATIC,54,111,126,8 - EDITTEXT IDC_ROWSPERBEAT,18,108,30,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Rows per &measure",IDC_STATIC,54,128,126,8 - EDITTEXT IDC_ROWSPERMEASURE,18,127,30,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,144,174,1 - LTEXT "Pattern Info",IDC_TEXT1,6,151,174,14 - DEFPUSHBUTTON "&OK",IDOK,132,6,50,14 - PUSHBUTTON "&Cancel",IDCANCEL,132,24,50,14 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,114,168,10 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,132,184,1 + CONTROL "Override &song signature:",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,138,108,12 + PUSHBUTTON "Configure S&wing",IDC_BUTTON1,124,138,66,12 + LTEXT "Rows per b&eat",IDC_STATIC,64,159,126,8 + EDITTEXT IDC_ROWSPERBEAT,24,156,30,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,48,159,11,14 + LTEXT "Rows per &measure",IDC_STATIC,64,176,126,8 + EDITTEXT IDC_ROWSPERMEASURE,24,175,30,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN3,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,48,173,11,14 + DEFPUSHBUTTON "&OK",IDOK,140,6,50,14 + PUSHBUTTON "&Cancel",IDCANCEL,140,24,50,14 END IDD_PATTERN_EDITCOMMAND DIALOGEX 0, 0, 304, 95 @@ -2358,11 +2364,11 @@ GROUPBOX "Volume Ramping",IDC_STATIC,6,60,312,72 EDITTEXT IDC_RAMPING_IN,12,72,36,12,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,42,66,11,14 - LTEXT "s &up",IDC_STATIC,54,72,22,12,SS_CENTERIMAGE + LTEXT "µs &up",IDC_STATIC,54,72,22,12,SS_CENTERIMAGE EDITTEXT IDC_EDIT_VOLRAMP_SAMPLES_UP,90,72,90,12,ES_AUTOHSCROLL | ES_READONLY EDITTEXT IDC_RAMPING_OUT,12,90,36,12,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN3,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,42,84,11,14 - LTEXT "s &down",IDC_STATIC,54,92,28,11,SS_CENTERIMAGE + LTEXT "µs &down",IDC_STATIC,54,92,28,11,SS_CENTERIMAGE EDITTEXT IDC_EDIT_VOLRAMP_SAMPLES_DOWN,90,90,90,12,ES_AUTOHSCROLL | ES_READONLY PUSHBUTTON "&Reset to Defaults",IDC_BUTTON1,12,110,72,14 GROUPBOX "Behaviour",IDC_STATIC,6,144,312,30 @@ -2517,10 +2523,10 @@ IDD_PATTERN_PROPERTIES, DIALOG BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 187 - TOPMARGIN, 4 - BOTTOMMARGIN, 166 + LEFTMARGIN, 6 + RIGHTMARGIN, 190 + TOPMARGIN, 6 + BOTTOMMARGIN, 187 END IDD_PATTERN_EDITCOMMAND, DIALOG @@ -2822,6 +2828,11 @@ BEGIN 0 END + +IDD_PATTERN_PROPERTIES AFX_DIALOG_LAYOUT +BEGIN + 0 +END IDD_QUICKSTART AFX_DIALOG_LAYOUT BEGIN Modified: branches/OpenMPT-1.32/soundlib/pattern.cpp ============================================================================== --- branches/OpenMPT-1.32/soundlib/pattern.cpp Sun May 4 20:42:24 2025 (r23160) +++ branches/OpenMPT-1.32/soundlib/pattern.cpp Sun May 4 20:45:19 2025 (r23161) @@ -65,19 +65,21 @@ bool CPattern::SetSignature(const ROWINDEX rowsPerBeat, const ROWINDEX rowsPerMeasure) noexcept { - if(rowsPerBeat < 1 - || rowsPerBeat > GetSoundFile().GetModSpecifications().patternRowsMax - || rowsPerMeasure < rowsPerBeat - || rowsPerMeasure > GetSoundFile().GetModSpecifications().patternRowsMax) - { + if(!IsValidSignature(rowsPerBeat, rowsPerMeasure)) return false; - } m_RowsPerBeat = rowsPerBeat; m_RowsPerMeasure = rowsPerMeasure; return true; } +bool CPattern::IsValidSignature(const ROWINDEX rowsPerBeat, const ROWINDEX rowsPerMeasure) noexcept +{ + return rowsPerBeat > 0 && rowsPerBeat <= MAX_ROWS_PER_BEAT + && rowsPerBeat <= rowsPerMeasure && rowsPerMeasure <= MAX_ROWS_PER_MEASURE; +} + + // Add or remove rows from the pattern. bool CPattern::Resize(const ROWINDEX newRowCount, bool enforceFormatLimits, bool resizeAtEnd) { @@ -273,9 +275,9 @@ #endif // MODPLUG_TRACKER -bool CPattern::SetName(const std::string &newName) +bool CPattern::SetName(std::string newName) { - m_PatternName = newName; + m_PatternName = std::move(newName); return true; } Modified: branches/OpenMPT-1.32/soundlib/pattern.h ============================================================================== --- branches/OpenMPT-1.32/soundlib/pattern.h Sun May 4 20:42:24 2025 (r23160) +++ branches/OpenMPT-1.32/soundlib/pattern.h Sun May 4 20:45:19 2025 (r23161) @@ -81,6 +81,7 @@ // Set pattern signature (rows per beat, rows per measure). Returns true on success. bool SetSignature(const ROWINDEX rowsPerBeat, const ROWINDEX rowsPerMeasure) noexcept; void RemoveSignature() noexcept { m_RowsPerBeat = m_RowsPerMeasure = 0; } + static bool IsValidSignature(const ROWINDEX rowsPerBeat, const ROWINDEX rowsPerMeasure) noexcept; bool HasTempoSwing() const noexcept { return !m_tempoSwing.empty(); } const TempoSwing& GetTempoSwing() const noexcept { return m_tempoSwing; } @@ -88,7 +89,7 @@ void RemoveTempoSwing() noexcept { m_tempoSwing.clear(); } // Pattern name functions - bool functions return true on success. - bool SetName(const std::string &newName); + bool SetName(std::string newName); bool SetName(const char *newName, size_t maxChars); template<size_t bufferSize> bool SetName(const char (&buffer)[bufferSize]) |
From: <sv...@op...> - 2025-05-04 18:42:53
|
Author: sagamusix Date: Sun May 4 20:42:24 2025 New Revision: 23160 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23160 Log: [Imp] It is now possible in the Pattern Properties dialog to edit the properties of multiple patterns without having to close and re-open the dialog every time, and also change their names (https://forum.openmpt.org/index.php?topic=3454.0). Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp trunk/OpenMPT/mptrack/PatternEditorDialogs.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/soundlib/pattern.cpp trunk/OpenMPT/soundlib/pattern.h Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Sat May 3 21:35:13 2025 (r23159) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Sun May 4 20:42:24 2025 (r23160) @@ -127,16 +127,29 @@ // CPatternPropertiesDlg BEGIN_MESSAGE_MAP(CPatternPropertiesDlg, DialogBase) - ON_COMMAND(IDC_BUTTON_HALF, &CPatternPropertiesDlg::OnHalfRowNumber) - ON_COMMAND(IDC_BUTTON_DOUBLE, &CPatternPropertiesDlg::OnDoubleRowNumber) - ON_COMMAND(IDC_CHECK1, &CPatternPropertiesDlg::OnOverrideSignature) - ON_COMMAND(IDC_BUTTON1, &CPatternPropertiesDlg::OnTempoSwing) + ON_WM_VSCROLL() + ON_COMMAND(IDC_BUTTON_HALF, &CPatternPropertiesDlg::OnHalfRowNumber) + ON_COMMAND(IDC_BUTTON_DOUBLE, &CPatternPropertiesDlg::OnDoubleRowNumber) + ON_COMMAND(IDC_CHECK1, &CPatternPropertiesDlg::OnOverrideSignature) + ON_COMMAND(IDC_BUTTON1, &CPatternPropertiesDlg::OnTempoSwing) + ON_EN_CHANGE(IDC_EDIT1, &CPatternPropertiesDlg::OnPatternChanged) END_MESSAGE_MAP() +void CPatternPropertiesDlg::DoDataExchange(CDataExchange *pDX) +{ + DialogBase::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CPatternPropertiesDlg) + DDX_Control(pDX, IDC_COMBO1, m_numRows); + DDX_Control(pDX, IDC_SPIN1, m_spinPattern); + DDX_Control(pDX, IDC_SPIN2, m_spinRPB); + DDX_Control(pDX, IDC_SPIN3, m_spinRPM); + //}}AFX_DATA_MAP +} + CPatternPropertiesDlg::CPatternPropertiesDlg(CModDoc &modParent, PATTERNINDEX nPat, CWnd *parent) : DialogBase{IDD_PATTERN_PROPERTIES, parent} - , modDoc{modParent} + , m_modDoc{modParent} , m_nPattern{nPat} { } @@ -144,38 +157,54 @@ BOOL CPatternPropertiesDlg::OnInitDialog() { - CComboBox *combo; DialogBase::OnInitDialog(); - combo = (CComboBox *)GetDlgItem(IDC_COMBO1); - const CSoundFile &sndFile = modDoc.GetSoundFile(); - if(m_nPattern < sndFile.Patterns.Size() && combo) + const CSoundFile &sndFile = m_modDoc.GetSoundFile(); + const CModSpecifications &specs = sndFile.GetModSpecifications(); + m_numRows.SetRedraw(FALSE); + for(ROWINDEX irow = specs.patternRowsMin; irow <= specs.patternRowsMax; irow++) { - CString s; - const CPattern &pattern = sndFile.Patterns[m_nPattern]; - ROWINDEX nrows = pattern.GetNumRows(); + m_numRows.AddString(mpt::cfmt::dec(irow)); + } + m_numRows.SetRedraw(TRUE); + m_numRows.SetFocus(); + m_spinRPB.SetRange32(1, MAX_ROWS_PER_BEAT); + m_spinRPM.SetRange32(1, MAX_ROWS_PER_MEASURE); + m_spinPattern.SetRange32(-1, 1); + SetDlgItemInt(IDC_EDIT1, m_nPattern); + CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO2); + static_cast<CEdit *>(GetDlgItem(IDC_EDIT2))->SetLimitText(MAX_PATTERNNAME - 1); - const CModSpecifications &specs = sndFile.GetModSpecifications(); - combo->SetRedraw(FALSE); - for(UINT irow = specs.patternRowsMin; irow <= specs.patternRowsMax; irow++) - { - combo->AddString(mpt::cfmt::dec(irow)); - } - combo->SetCurSel(nrows - specs.patternRowsMin); - combo->SetRedraw(TRUE); + m_locked = false; + SetCurrentPattern(m_nPattern); + + return FALSE; +} - CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO2); - s = MPT_CFORMAT("Pattern #{}: {} row{} ({}K)")( - m_nPattern, - pattern.GetNumRows(), - (pattern.GetNumRows() == 1) ? CString(_T("")) : CString(_T("s")), - static_cast<int>((pattern.GetNumRows() * sndFile.GetNumChannels() * sizeof(ModCommand)) / 1024)); - SetDlgItemText(IDC_TEXT1, s); +void CPatternPropertiesDlg::SetCurrentPattern(PATTERNINDEX pat) +{ + if(m_locked) + return; + const CSoundFile &sndFile = m_modDoc.GetSoundFile(); + const bool validPat = sndFile.Patterns.IsValidPat(pat); + + for(auto id : { IDC_EDIT2, IDC_COMBO1, IDC_BUTTON_HALF, IDC_BUTTON_DOUBLE, IDC_RADIO1, IDC_RADIO2, IDC_CHECK2, IDC_BUTTON1, IDC_ROWSPERBEAT, IDC_ROWSPERMEASURE, IDC_SPIN2, IDC_SPIN3 }) + { + GetDlgItem(id)->EnableWindow(validPat ? TRUE : FALSE); + } + GetDlgItem(IDC_CHECK1)->EnableWindow((sndFile.GetModSpecifications().hasPatternSignatures && validPat) ? TRUE : FALSE); + if(validPat) + { + m_nPattern = pat; + PatternProperties &prop = GetPatternProperties(); + m_numRows.SetCurSel(prop.numRows - sndFile.GetModSpecifications().patternRowsMin); + CheckRadioButton(IDC_RADIO1, IDC_RADIO2, prop.resizeAtEnd ? IDC_RADIO2 : IDC_RADIO1); // Window title - const CString patternName = mpt::ToCString(sndFile.GetCharsetInternal(), pattern.GetName()); - s = MPT_CFORMAT("Pattern Properties for Pattern #{}")(m_nPattern); + const CString patternName = mpt::ToCString(sndFile.GetCharsetInternal(), prop.name); + SetDlgItemText(IDC_EDIT2, patternName); + CString s = MPT_CFORMAT("Pattern Properties for Pattern #{}")(m_nPattern); if(!patternName.IsEmpty()) { s += _T(" ("); @@ -185,30 +214,161 @@ SetWindowText(s); // Pattern time signature - const bool bOverride = pattern.GetOverrideSignature(); - ROWINDEX nRPB = pattern.GetRowsPerBeat(), nRPM = pattern.GetRowsPerMeasure(); - if(nRPB == 0 || !bOverride) - nRPB = sndFile.m_nDefaultRowsPerBeat; - if(nRPM == 0 || !bOverride) - nRPM = sndFile.m_nDefaultRowsPerMeasure; - - m_tempoSwing = pattern.HasTempoSwing() ? pattern.GetTempoSwing() : sndFile.m_tempoSwing; - - GetDlgItem(IDC_CHECK1)->EnableWindow(sndFile.GetModSpecifications().hasPatternSignatures ? TRUE : FALSE); - CheckDlgButton(IDC_CHECK1, bOverride ? BST_CHECKED : BST_UNCHECKED); - SetDlgItemInt(IDC_ROWSPERBEAT, nRPB, FALSE); - SetDlgItemInt(IDC_ROWSPERMEASURE, nRPM, FALSE); + const bool overrideSignature = prop.rowsPerBeat != 0 || prop.rowsPerMeasure != 0; + ROWINDEX rpb = prop.rowsPerBeat, rpm = prop.rowsPerMeasure; + if(rpb == 0 || !overrideSignature) + rpb = sndFile.m_nDefaultRowsPerBeat; + if(rpm == 0 || !overrideSignature) + rpm = sndFile.m_nDefaultRowsPerMeasure; + + CheckDlgButton(IDC_CHECK1, overrideSignature ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(IDC_CHECK2, prop.repeatContents ? BST_CHECKED : BST_UNCHECKED); + SetDlgItemInt(IDC_ROWSPERBEAT, rpb, FALSE); + SetDlgItemInt(IDC_ROWSPERMEASURE, rpm, FALSE); OnOverrideSignature(); + } else + { + MessageBeep(MB_ICONWARNING); } - return TRUE; +} + + +void CPatternPropertiesDlg::StorePatternProperties() +{ + if(m_locked) + return; + auto &prop = GetPatternProperties(); + CString str; + GetDlgItemText(IDC_EDIT2, str); + prop.name = mpt::ToCharset(m_modDoc.GetSoundFile().GetCharsetInternal(), str); + prop.numRows = GetDlgItemInt(IDC_COMBO1); + prop.resizeAtEnd = IsDlgButtonChecked(IDC_RADIO2) != BST_UNCHECKED; + prop.repeatContents = IsDlgButtonChecked(IDC_CHECK2) != BST_UNCHECKED; + if(IsDlgButtonChecked(IDC_CHECK1) != BST_UNCHECKED) + { + prop.rowsPerBeat = GetDlgItemInt(IDC_ROWSPERBEAT); + prop.rowsPerMeasure = GetDlgItemInt(IDC_ROWSPERMEASURE); + } else + { + prop.rowsPerBeat = prop.rowsPerMeasure = 0; + } +} + + +bool CPatternPropertiesDlg::ValidatePatternProperties() +{ + StorePatternProperties(); + + CSoundFile &sndFile = m_modDoc.GetSoundFile(); + auto &prop = GetPatternProperties(); + // Check for valid time signatures + if((prop.rowsPerBeat != 0 || prop.rowsPerMeasure != 0) && !CPattern::IsValidSignature(prop.rowsPerBeat, prop.rowsPerMeasure)) + { + Reporting::Error("Invalid time signature!", "Pattern Properties"); + SetCurrentPattern(m_nPattern); + SetDlgItemInt(IDC_EDIT1, m_nPattern); + GetDlgItem(IDC_ROWSPERBEAT)->SetFocus(); + return false; + } + + // Check if any pattern data would be removed. + CPattern &pattern = sndFile.Patterns[m_nPattern]; + const ROWINDEX newSize = prop.numRows; + const ROWINDEX oldSize = pattern.GetNumRows(); + if(pattern.IsValid() && newSize < oldSize + && (prop.resizeWarningShown != newSize || prop.resizeWarningAtEnd != prop.resizeAtEnd)) + { + ROWINDEX firstRow = prop.resizeAtEnd ? newSize : 0; + ROWINDEX lastRow = prop.resizeAtEnd ? oldSize : oldSize - newSize; + for(ROWINDEX row = firstRow; row < lastRow; row++) + { + if(!pattern.IsEmptyRow(row)) + { + bool resize = (Reporting::Confirm(MPT_AFORMAT("Data at the {} of pattern {} will be lost.\nDo you want to continue?")(prop.resizeAtEnd ? "end" : "start", m_nPattern), "Shrink Pattern") == cnfYes); + if(!resize) + { + SetCurrentPattern(m_nPattern); + SetDlgItemInt(IDC_EDIT1, m_nPattern); + m_numRows.SetFocus(); + return false; + } + break; + } + } + prop.resizeWarningShown = prop.numRows; + prop.resizeWarningAtEnd = prop.resizeAtEnd; + } + return true; +} + + +void CPatternPropertiesDlg::OnPatternChanged() +{ + auto pat = GetDlgItemInt(IDC_EDIT1); + if(m_locked || pat == m_nPattern) + return; + if(!ValidatePatternProperties()) + return; + SetCurrentPattern(mpt::saturate_cast<PATTERNINDEX>(pat)); +} + + +void CPatternPropertiesDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) +{ + DialogBase::OnVScroll(nSBCode, nPos, pScrollBar); + + const int direction = m_spinPattern.GetPos32(); + const auto &patterns = m_modDoc.GetSoundFile().Patterns; + if(!direction || !patterns.IsValidPat(m_nPattern)) + return; + int pattern = std::clamp(static_cast<int>(GetDlgItemInt(IDC_EDIT1)), 0, patterns.Size() - 1); + const int startPattern = pattern; + do + { + pattern += direction; + if(pattern < 0) + pattern = patterns.Size() - 1; + else if(pattern >= patterns.Size()) + pattern = 0; + else if(pattern == startPattern) + break; // Couldn't find any other pattern, abort + } while(!patterns.IsValidPat(static_cast<PATTERNINDEX>(pattern))); + m_spinPattern.SetPos32(0); + SetDlgItemInt(IDC_EDIT1, static_cast<PATTERNINDEX>(pattern)); +} + + +CPatternPropertiesDlg::PatternProperties& CPatternPropertiesDlg::GetPatternProperties(PATTERNINDEX pat) +{ + if(auto p = m_properties.find(pat); p != m_properties.end()) + return p->second; + + const CSoundFile &sndFile = m_modDoc.GetSoundFile(); + PatternProperties prop; + if(sndFile.Patterns.IsValidPat(pat)) + { + const CPattern &pattern = sndFile.Patterns[pat]; + prop.name = pattern.GetName(); + if(pattern.HasTempoSwing()) + prop.tempoSwing = pattern.GetTempoSwing(); + else + prop.tempoSwing = sndFile.m_tempoSwing; + prop.numRows = pattern.GetNumRows(); + prop.rowsPerBeat = pattern.GetRowsPerBeat(); + prop.rowsPerMeasure = pattern.GetRowsPerMeasure(); + } + // Take whatever was selected for the previous pattern to be the default for this newly-edited pattern as well + prop.resizeAtEnd = IsDlgButtonChecked(IDC_RADIO2) != BST_UNCHECKED; + prop.repeatContents = IsDlgButtonChecked(IDC_CHECK2) != BST_UNCHECKED; + return m_properties.insert(std::make_pair(pat, std::move(prop))).first->second; } void CPatternPropertiesDlg::OnHalfRowNumber() { - const CSoundFile &sndFile = modDoc.GetSoundFile(); + const CSoundFile &sndFile = m_modDoc.GetSoundFile(); - UINT nRows = GetDlgItemInt(IDC_COMBO1, NULL, FALSE); + UINT nRows = GetDlgItemInt(IDC_COMBO1, nullptr, FALSE); nRows /= 2; if(nRows < sndFile.GetModSpecifications().patternRowsMin) nRows = sndFile.GetModSpecifications().patternRowsMin; @@ -218,9 +378,9 @@ void CPatternPropertiesDlg::OnDoubleRowNumber() { - const CSoundFile &sndFile = modDoc.GetSoundFile(); + const CSoundFile &sndFile = m_modDoc.GetSoundFile(); - UINT nRows = GetDlgItemInt(IDC_COMBO1, NULL, FALSE); + UINT nRows = GetDlgItemInt(IDC_COMBO1, nullptr, FALSE); nRows *= 2; if(nRows > sndFile.GetModSpecifications().patternRowsMax) nRows = sndFile.GetModSpecifications().patternRowsMax; @@ -230,15 +390,16 @@ void CPatternPropertiesDlg::OnOverrideSignature() { - GetDlgItem(IDC_ROWSPERBEAT)->EnableWindow(IsDlgButtonChecked(IDC_CHECK1)); - GetDlgItem(IDC_ROWSPERMEASURE)->EnableWindow(IsDlgButtonChecked(IDC_CHECK1)); - GetDlgItem(IDC_BUTTON1)->EnableWindow(IsDlgButtonChecked(IDC_CHECK1) && modDoc.GetSoundFile().m_nTempoMode == TempoMode::Modern); + const BOOL enableTimeSignature = IsDlgButtonChecked(IDC_CHECK1); + GetDlgItem(IDC_ROWSPERBEAT)->EnableWindow(enableTimeSignature); + GetDlgItem(IDC_ROWSPERMEASURE)->EnableWindow(enableTimeSignature); + GetDlgItem(IDC_BUTTON1)->EnableWindow(enableTimeSignature && m_modDoc.GetSoundFile().m_nTempoMode == TempoMode::Modern); } void CPatternPropertiesDlg::OnTempoSwing() { - CPattern &pat = modDoc.GetSoundFile().Patterns[m_nPattern]; + CPattern &pat = m_modDoc.GetSoundFile().Patterns[m_nPattern]; const ROWINDEX oldRPB = pat.GetRowsPerBeat(); const ROWINDEX oldRPM = pat.GetRowsPerMeasure(); @@ -247,11 +408,12 @@ const ROWINDEX newRPM = std::clamp(static_cast<ROWINDEX>(GetDlgItemInt(IDC_ROWSPERMEASURE)), newRPB, MAX_ROWS_PER_BEAT); pat.SetSignature(newRPB, newRPM); - m_tempoSwing.resize(newRPB, TempoSwing::Unity); - CTempoSwingDlg dlg(this, m_tempoSwing, modDoc.GetSoundFile(), m_nPattern); + TempoSwing &tempoSwing = GetPatternProperties().tempoSwing; + tempoSwing.resize(newRPB, TempoSwing::Unity); + CTempoSwingDlg dlg(this, tempoSwing, m_modDoc.GetSoundFile(), m_nPattern); if(dlg.DoModal() == IDOK) { - m_tempoSwing = dlg.m_tempoSwing; + tempoSwing = dlg.m_tempoSwing; } pat.SetSignature(oldRPB, oldRPM); } @@ -259,87 +421,91 @@ void CPatternPropertiesDlg::OnOK() { - CSoundFile &sndFile = modDoc.GetSoundFile(); - CPattern &pattern = sndFile.Patterns[m_nPattern]; - // Update pattern signature if necessary - if(sndFile.GetModSpecifications().hasPatternSignatures) + if(!ValidatePatternProperties()) + return; + + CSoundFile &sndFile = m_modDoc.GetSoundFile(); + bool modified = false; + for(const auto &[pat, prop] : m_properties) { - if(IsDlgButtonChecked(IDC_CHECK1)) - { - // Enable signature - const ROWINDEX newRPB = std::min(static_cast<ROWINDEX>(GetDlgItemInt(IDC_ROWSPERBEAT, NULL, FALSE)), MAX_ROWS_PER_BEAT); - const ROWINDEX newRPM = std::min(static_cast<ROWINDEX>(GetDlgItemInt(IDC_ROWSPERMEASURE, NULL, FALSE)), MAX_ROWS_PER_BEAT); + PatternHint updateHint = PatternHint{pat}; - if(newRPB != pattern.GetRowsPerBeat() || newRPM != pattern.GetRowsPerMeasure() || m_tempoSwing != pattern.GetTempoSwing()) + CPattern &pattern = sndFile.Patterns[pat]; + // Update pattern signature if necessary + if(sndFile.GetModSpecifications().hasPatternSignatures) + { + if(prop.rowsPerBeat != 0 || prop.rowsPerMeasure != 0) { - if(!pattern.SetSignature(newRPB, newRPM)) + // Enable signature + const ROWINDEX newRPB = prop.rowsPerBeat; + const ROWINDEX newRPM = prop.rowsPerMeasure; + TempoSwing tempoSwing = prop.tempoSwing; + if(newRPB != pattern.GetRowsPerBeat() || newRPM != pattern.GetRowsPerMeasure() || tempoSwing != pattern.GetTempoSwing()) { - Reporting::Error("Invalid time signature!", "Pattern Properties"); - GetDlgItem(IDC_ROWSPERBEAT)->SetFocus(); - return; + pattern.SetSignature(newRPB, newRPM); + tempoSwing.resize(newRPB, TempoSwing::Unity); + pattern.SetTempoSwing(tempoSwing); + updateHint.Data(); } - m_tempoSwing.resize(newRPB, TempoSwing::Unity); - pattern.SetTempoSwing(m_tempoSwing); - modDoc.SetModified(); - } - } else - { - // Disable signature - if(pattern.GetOverrideSignature() || pattern.HasTempoSwing()) + } else { - pattern.RemoveSignature(); - pattern.RemoveTempoSwing(); - modDoc.SetModified(); + // Disable signature + if(pattern.GetOverrideSignature() || pattern.HasTempoSwing()) + { + pattern.RemoveSignature(); + pattern.RemoveTempoSwing(); + updateHint.Data(); + } } } - } - - const ROWINDEX newSize = (ROWINDEX)GetDlgItemInt(IDC_COMBO1, NULL, FALSE); + const ROWINDEX newSize = prop.numRows; - // Check if any pattern data would be removed. - const ROWINDEX oldSize = pattern.GetNumRows(); - bool resize = newSize != oldSize; - const bool resizeAtEnd = IsDlgButtonChecked(IDC_RADIO2) != BST_UNCHECKED; - if(newSize < pattern.GetNumRows()) - { - ROWINDEX firstRow = resizeAtEnd ? newSize : 0; - ROWINDEX lastRow = resizeAtEnd ? oldSize : oldSize - newSize; - for(ROWINDEX row = firstRow; row < lastRow; row++) - { - if(!pattern.IsEmptyRow(row)) + // Check if any pattern data would be removed. + const ROWINDEX oldSize = pattern.GetNumRows(); + bool resize = newSize != oldSize; + const bool resizeAtEnd = prop.resizeAtEnd; + if(resize) + { + const bool copyContents = (newSize > oldSize) && prop.repeatContents; + m_modDoc.BeginWaitCursor(); + m_modDoc.GetPatternUndo().PrepareUndo(m_nPattern, 0, 0, sndFile.Patterns[m_nPattern].GetNumChannels(), oldSize, "Resize"); + if(sndFile.Patterns[m_nPattern].Resize(newSize, true, resizeAtEnd)) { - resize = (Reporting::Confirm(MPT_AFORMAT("Data at the {} of the pattern will be lost.\nDo you want to continue?")(resizeAtEnd ? "end" : "start"), "Shrink Pattern") == cnfYes); - break; + if(copyContents) + { + const ROWINDEX copyRows = newSize - oldSize; + const ROWINDEX sourceBaseRow = resizeAtEnd ? 0 : copyRows; + const ROWINDEX baseOffset = resizeAtEnd ? 0 : (oldSize - copyRows % oldSize); + ROWINDEX destRow = resizeAtEnd ? oldSize : 0; + for(ROWINDEX row = 0; row < copyRows; row++, destRow++) + { + ROWINDEX sourceRow = sourceBaseRow + (baseOffset + row) % oldSize; + const auto sourceRowData = pattern.GetRow(sourceRow); + auto destRowData = pattern.GetRow(destRow); + std::copy(sourceRowData.begin(), sourceRowData.end(), destRowData.begin()); + } + } + updateHint.Data(); } + m_modDoc.EndWaitCursor(); + } + if(pattern.GetName() != prop.name) + { + pattern.SetName(prop.name); + updateHint.Names(); } - } - if(resize) - { - const bool copyContents = (newSize > oldSize) && IsDlgButtonChecked(IDC_CHECK2) != BST_UNCHECKED; - modDoc.BeginWaitCursor(); - modDoc.GetPatternUndo().PrepareUndo(m_nPattern, 0, 0, sndFile.Patterns[m_nPattern].GetNumChannels(), oldSize, "Resize"); - if(sndFile.Patterns[m_nPattern].Resize(newSize, true, resizeAtEnd)) + if(updateHint.GetType() != HINT_NONE) { - if(copyContents) - { - const ROWINDEX copyRows = newSize - oldSize; - const ROWINDEX sourceBaseRow = resizeAtEnd ? 0 : copyRows; - const ROWINDEX baseOffset = resizeAtEnd ? 0 : (oldSize - copyRows % oldSize); - ROWINDEX destRow = resizeAtEnd ? oldSize : 0; - for(ROWINDEX row = 0; row < copyRows; row++, destRow++) - { - ROWINDEX sourceRow = sourceBaseRow + (baseOffset + row) % oldSize; - const auto sourceRowData = pattern.GetRow(sourceRow); - auto destRowData = pattern.GetRow(destRow); - std::copy(sourceRowData.begin(), sourceRowData.end(), destRowData.begin()); - } - } - modDoc.SetModified(); + m_modDoc.UpdateAllViews(nullptr, updateHint, this); + modified = true; } - modDoc.EndWaitCursor(); } + + if(modified) + m_modDoc.SetModified(); + DialogBase::OnOK(); } @@ -363,7 +529,7 @@ void CEditCommand::DoDataExchange(CDataExchange* pDX) { DialogBase::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CSplitKeyboadSettings) + //{{AFX_DATA_MAP(CEditCommand) DDX_Control(pDX, IDC_COMBO1, cbnNote); DDX_Control(pDX, IDC_COMBO2, cbnInstr); DDX_Control(pDX, IDC_COMBO3, cbnVolCmd); @@ -1700,7 +1866,7 @@ cmd = kcChnColorFromNext; break; } - + if(cmd != kcNull) { auto keyText = CMainFrame::GetInputHandler()->m_activeCommandSet->GetKeyTextFromCommand(cmd, 0); Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.h ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.h Sat May 3 21:35:13 2025 (r23159) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.h Sun May 4 20:42:24 2025 (r23160) @@ -28,22 +28,45 @@ class CPatternPropertiesDlg : public DialogBase { -protected: - CModDoc &modDoc; - TempoSwing m_tempoSwing; - PATTERNINDEX m_nPattern; - public: CPatternPropertiesDlg(CModDoc &modParent, PATTERNINDEX nPat, CWnd *parent = nullptr); protected: + void DoDataExchange(CDataExchange *pDX) override; BOOL OnInitDialog() override; void OnOK() override; + afx_msg void OnHalfRowNumber(); afx_msg void OnDoubleRowNumber(); afx_msg void OnOverrideSignature(); afx_msg void OnTempoSwing(); + afx_msg void OnPatternChanged(); + afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar); + DECLARE_MESSAGE_MAP() + + struct PatternProperties + { + std::string name; + TempoSwing tempoSwing; + ROWINDEX numRows = 0, rowsPerBeat = 0, rowsPerMeasure = 0; + ROWINDEX resizeWarningShown = 0; + bool resizeWarningAtEnd = false; + bool resizeAtEnd = true, repeatContents = false; + }; + + PatternProperties& GetPatternProperties(PATTERNINDEX pat); + PatternProperties& GetPatternProperties() { return GetPatternProperties(m_nPattern); } + void StorePatternProperties(); + void SetCurrentPattern(PATTERNINDEX pat); + bool ValidatePatternProperties(); + + CModDoc &m_modDoc; + std::map<PATTERNINDEX, PatternProperties> m_properties; + PATTERNINDEX m_nPattern; + CSpinButtonCtrl m_spinPattern, m_spinRPB, m_spinRPM; + CComboBox m_numRows; + bool m_locked = true; }; @@ -115,7 +138,7 @@ CComboBox m_CbnShortcut, m_CbnBaseNote, m_CbnNote[MPTChord::notesPerChord - 1]; MPTChords m_chords; MPTChord::NoteType m_mouseDownKey = MPTChord::noNote, m_dragKey = MPTChord::noNote; - + static constexpr MPTChord::NoteType CHORD_MIN = -24; static constexpr MPTChord::NoteType CHORD_MAX = 24; Modified: trunk/OpenMPT/mptrack/View_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp Sat May 3 21:35:13 2025 (r23159) +++ trunk/OpenMPT/mptrack/View_pat.cpp Sun May 4 20:42:24 2025 (r23160) @@ -1410,7 +1410,6 @@ UpdateScrollSize(); InvalidatePattern(true, true); SanitizeCursor(); - pModDoc->UpdateAllViews(this, PatternHint(pat).Data(), this); } } } Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Sat May 3 21:35:13 2025 (r23159) +++ trunk/OpenMPT/mptrack/mptrack.rc Sun May 4 20:42:24 2025 (r23160) @@ -13,10 +13,10 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// German (Germany) resources +// English (United States) resources -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) -LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) ///////////////////////////////////////////////////////////////////////////// @@ -1915,31 +1915,37 @@ CONTROL "Replace &All (No confirmation)",IDC_CHECK8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,126,186,10 END -IDD_PATTERN_PROPERTIES DIALOGEX 0, 0, 191, 170 +IDD_PATTERN_PROPERTIES DIALOGEX 0, 0, 195, 194 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Pattern Properties" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - LTEXT "&Rows:",IDC_STATIC,6,6,108,8 - COMBOBOX IDC_COMBO1,6,18,48,93,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&/2",IDC_BUTTON_HALF,60,18,18,12 - PUSHBUTTON "&x2",IDC_BUTTON_DOUBLE,84,18,18,12 - LTEXT "Remove rows from / Add rows at:",IDC_STATIC,6,36,126,8 - CONTROL "&Top of Pattern",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,6,48,84,12 - CONTROL "&Bottom of Pattern",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,90,48,84,12 + LTEXT "Pattern:",IDC_STATIC,6,8,36,8 + EDITTEXT IDC_EDIT1,42,6,40,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN1,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,84,6,11,14 + LTEXT "Name:",IDC_STATIC,6,26,36,8 + EDITTEXT IDC_EDIT2,42,24,84,12,ES_AUTOHSCROLL + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,48,184,1 + LTEXT "&Rows:",IDC_STATIC,12,54,108,8 + COMBOBOX IDC_COMBO1,12,66,48,93,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "&/2",IDC_BUTTON_HALF,66,66,18,12 + PUSHBUTTON "&x2",IDC_BUTTON_DOUBLE,90,66,18,12 + LTEXT "Remove rows from / Add rows at:",IDC_STATIC,12,84,126,8 + CONTROL "&Top of Pattern",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,12,96,84,12 + CONTROL "&Bottom of Pattern",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,96,96,84,12 CONTROL "Repeat pattern contents when &adding rows",IDC_CHECK2, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,66,168,10 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,84,174,1 - CONTROL "Override &song signature:",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,90,108,12 - PUSHBUTTON "Configure S&wing",IDC_BUTTON1,114,90,66,12 - LTEXT "Rows per b&eat",IDC_STATIC,54,111,126,8 - EDITTEXT IDC_ROWSPERBEAT,18,108,30,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Rows per &measure",IDC_STATIC,54,128,126,8 - EDITTEXT IDC_ROWSPERMEASURE,18,127,30,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,144,174,1 - LTEXT "Pattern Info",IDC_TEXT1,6,151,174,14 - DEFPUSHBUTTON "&OK",IDOK,132,6,50,14 - PUSHBUTTON "&Cancel",IDCANCEL,132,24,50,14 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,114,168,10 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,132,184,1 + CONTROL "Override &song signature:",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,138,108,12 + PUSHBUTTON "Configure S&wing",IDC_BUTTON1,124,138,66,12 + LTEXT "Rows per b&eat",IDC_STATIC,64,159,126,8 + EDITTEXT IDC_ROWSPERBEAT,24,156,30,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,48,159,11,14 + LTEXT "Rows per &measure",IDC_STATIC,64,176,126,8 + EDITTEXT IDC_ROWSPERMEASURE,24,175,30,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN3,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,48,173,11,14 + DEFPUSHBUTTON "&OK",IDOK,140,6,50,14 + PUSHBUTTON "&Cancel",IDCANCEL,140,24,50,14 END IDD_PATTERN_EDITCOMMAND DIALOGEX 0, 0, 304, 95 @@ -2358,11 +2364,11 @@ GROUPBOX "Volume Ramping",IDC_STATIC,6,60,312,72 EDITTEXT IDC_RAMPING_IN,12,72,36,12,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,42,66,11,14 - LTEXT "s &up",IDC_STATIC,54,72,22,12,SS_CENTERIMAGE + LTEXT "µs &up",IDC_STATIC,54,72,22,12,SS_CENTERIMAGE EDITTEXT IDC_EDIT_VOLRAMP_SAMPLES_UP,90,72,90,12,ES_AUTOHSCROLL | ES_READONLY EDITTEXT IDC_RAMPING_OUT,12,90,36,12,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN3,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,42,84,11,14 - LTEXT "s &down",IDC_STATIC,54,92,28,11,SS_CENTERIMAGE + LTEXT "µs &down",IDC_STATIC,54,92,28,11,SS_CENTERIMAGE EDITTEXT IDC_EDIT_VOLRAMP_SAMPLES_DOWN,90,90,90,12,ES_AUTOHSCROLL | ES_READONLY PUSHBUTTON "&Reset to Defaults",IDC_BUTTON1,12,110,72,14 GROUPBOX "Behaviour",IDC_STATIC,6,144,312,30 @@ -2517,10 +2523,10 @@ IDD_PATTERN_PROPERTIES, DIALOG BEGIN - LEFTMARGIN, 4 - RIGHTMARGIN, 187 - TOPMARGIN, 4 - BOTTOMMARGIN, 166 + LEFTMARGIN, 6 + RIGHTMARGIN, 190 + TOPMARGIN, 6 + BOTTOMMARGIN, 187 END IDD_PATTERN_EDITCOMMAND, DIALOG @@ -2822,6 +2828,11 @@ BEGIN 0 END + +IDD_PATTERN_PROPERTIES AFX_DIALOG_LAYOUT +BEGIN + 0 +END IDD_QUICKSTART AFX_DIALOG_LAYOUT BEGIN Modified: trunk/OpenMPT/soundlib/pattern.cpp ============================================================================== --- trunk/OpenMPT/soundlib/pattern.cpp Sat May 3 21:35:13 2025 (r23159) +++ trunk/OpenMPT/soundlib/pattern.cpp Sun May 4 20:42:24 2025 (r23160) @@ -65,19 +65,21 @@ bool CPattern::SetSignature(const ROWINDEX rowsPerBeat, const ROWINDEX rowsPerMeasure) noexcept { - if(rowsPerBeat < 1 - || rowsPerBeat > GetSoundFile().GetModSpecifications().patternRowsMax - || rowsPerMeasure < rowsPerBeat - || rowsPerMeasure > GetSoundFile().GetModSpecifications().patternRowsMax) - { + if(!IsValidSignature(rowsPerBeat, rowsPerMeasure)) return false; - } m_RowsPerBeat = rowsPerBeat; m_RowsPerMeasure = rowsPerMeasure; return true; } +bool CPattern::IsValidSignature(const ROWINDEX rowsPerBeat, const ROWINDEX rowsPerMeasure) noexcept +{ + return rowsPerBeat > 0 && rowsPerBeat <= MAX_ROWS_PER_BEAT + && rowsPerBeat <= rowsPerMeasure && rowsPerMeasure <= MAX_ROWS_PER_MEASURE; +} + + // Add or remove rows from the pattern. bool CPattern::Resize(const ROWINDEX newRowCount, bool enforceFormatLimits, bool resizeAtEnd) { @@ -273,9 +275,9 @@ #endif // MODPLUG_TRACKER -bool CPattern::SetName(const std::string &newName) +bool CPattern::SetName(std::string newName) { - m_PatternName = newName; + m_PatternName = std::move(newName); return true; } Modified: trunk/OpenMPT/soundlib/pattern.h ============================================================================== --- trunk/OpenMPT/soundlib/pattern.h Sat May 3 21:35:13 2025 (r23159) +++ trunk/OpenMPT/soundlib/pattern.h Sun May 4 20:42:24 2025 (r23160) @@ -81,6 +81,7 @@ // Set pattern signature (rows per beat, rows per measure). Returns true on success. bool SetSignature(const ROWINDEX rowsPerBeat, const ROWINDEX rowsPerMeasure) noexcept; void RemoveSignature() noexcept { m_RowsPerBeat = m_RowsPerMeasure = 0; } + static bool IsValidSignature(const ROWINDEX rowsPerBeat, const ROWINDEX rowsPerMeasure) noexcept; bool HasTempoSwing() const noexcept { return !m_tempoSwing.empty(); } const TempoSwing& GetTempoSwing() const noexcept { return m_tempoSwing; } @@ -88,7 +89,7 @@ void RemoveTempoSwing() noexcept { m_tempoSwing.clear(); } // Pattern name functions - bool functions return true on success. - bool SetName(const std::string &newName); + bool SetName(std::string newName); bool SetName(const char *newName, size_t maxChars); template<size_t bufferSize> bool SetName(const char (&buffer)[bufferSize]) |
From: <sv...@op...> - 2025-05-03 19:37:24
|
Author: sagamusix Revision: 23158 Property Name: svn:log Action: modified Property diff: --- old property value +++ new property value @@ -1 +1 @@ -[Fix] Tree view: Don't disable MIDI callback just because focus was removed. This would also redirect focus to the active MDI window when switching to another application (https://bugs.openmpt.org/view.php?id=1881). \ No newline at end of file +[Fix] Tree view: Don't disable MIDI callback just because focus was removed. This would also redirect focus to the active MDI window when switching to another application (https://bugs.openmpt.org/view.php?id=1881). (Edit: This does not actually fix the problem, because Windows still redirects the focus to the active MDI window on defocus of the window, not on focus.) \ No newline at end of file |
From: <sv...@op...> - 2025-05-03 19:35:40
|
Author: sagamusix Date: Sat May 3 21:35:13 2025 New Revision: 23159 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23159 Log: Merged revision(s) 23158 from trunk/OpenMPT: [Fix] Tree view: Don't disable MIDI callback just because focus was removed. This would also redirect focus to the active MDI window when switching to another application (https://bugs.openmpt.org/view.php?id=1881). ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/View_tre.cpp branches/OpenMPT-1.32/mptrack/View_tre.h Modified: branches/OpenMPT-1.32/mptrack/View_tre.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/View_tre.cpp Sat May 3 21:34:50 2025 (r23158) +++ branches/OpenMPT-1.32/mptrack/View_tre.cpp Sat May 3 21:35:13 2025 (r23159) @@ -99,6 +99,9 @@ BEGIN_MESSAGE_MAP(CModTree, CTreeCtrl) //{{AFX_MSG_MAP(CViewModTree) + ON_WM_DESTROY() + ON_WM_KILLFOCUS() + ON_WM_SETFOCUS() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() ON_WM_RBUTTONUP() @@ -156,8 +159,6 @@ ON_MESSAGE(WM_MOD_KEYCOMMAND, &CModTree::OnCustomKeyMsg) ON_MESSAGE(WM_MOD_MIDIMSG, &CModTree::OnMidiMsg) //}}AFX_MSG_MAP - ON_WM_KILLFOCUS() - ON_WM_SETFOCUS() END_MESSAGE_MAP() @@ -261,6 +262,15 @@ } +void CModTree::OnDestroy() +{ + if(CMainFrame::GetMainFrame()->GetMidiRecordWnd() == m_hWnd) + { + CMainFrame::GetMainFrame()->SetMidiRecordWnd(nullptr); + } +} + + LRESULT CModTree::OnDPIChangedAfterParent(WPARAM, LPARAM) { auto result = Default(); @@ -4375,8 +4385,6 @@ } CTreeCtrl::OnKillFocus(pNewWnd); CMainFrame::GetMainFrame()->m_bModTreeHasFocus = false; - if(pNewWnd != nullptr) - CMainFrame::GetMainFrame()->SetMidiRecordWnd(pNewWnd->m_hWnd); } Modified: branches/OpenMPT-1.32/mptrack/View_tre.h ============================================================================== --- branches/OpenMPT-1.32/mptrack/View_tre.h Sat May 3 21:34:50 2025 (r23158) +++ branches/OpenMPT-1.32/mptrack/View_tre.h Sat May 3 21:35:13 2025 (r23159) @@ -345,6 +345,7 @@ afx_msg void OnDropFiles(HDROP hDropInfo); afx_msg void OnKillFocus(CWnd *pNewWnd); afx_msg void OnSetFocus(CWnd *pOldWnd); + afx_msg void OnDestroy(); afx_msg void OnSetItemPath(); afx_msg void OnSaveItem(); |
From: <sv...@op...> - 2025-05-03 19:35:17
|
Author: sagamusix Date: Sat May 3 21:34:50 2025 New Revision: 23158 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23158 Log: [Fix] Tree view: Don't disable MIDI callback just because focus was removed. This would also redirect focus to the active MDI window when switching to another application (https://bugs.openmpt.org/view.php?id=1881). Modified: trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/View_tre.h Modified: trunk/OpenMPT/mptrack/View_tre.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp Sat May 3 21:07:49 2025 (r23157) +++ trunk/OpenMPT/mptrack/View_tre.cpp Sat May 3 21:34:50 2025 (r23158) @@ -99,6 +99,9 @@ BEGIN_MESSAGE_MAP(CModTree, CTreeCtrl) //{{AFX_MSG_MAP(CViewModTree) + ON_WM_DESTROY() + ON_WM_KILLFOCUS() + ON_WM_SETFOCUS() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() ON_WM_RBUTTONUP() @@ -156,8 +159,6 @@ ON_MESSAGE(WM_MOD_KEYCOMMAND, &CModTree::OnCustomKeyMsg) ON_MESSAGE(WM_MOD_MIDIMSG, &CModTree::OnMidiMsg) //}}AFX_MSG_MAP - ON_WM_KILLFOCUS() - ON_WM_SETFOCUS() END_MESSAGE_MAP() @@ -261,6 +262,15 @@ } +void CModTree::OnDestroy() +{ + if(CMainFrame::GetMainFrame()->GetMidiRecordWnd() == m_hWnd) + { + CMainFrame::GetMainFrame()->SetMidiRecordWnd(nullptr); + } +} + + LRESULT CModTree::OnDPIChangedAfterParent(WPARAM, LPARAM) { auto result = Default(); @@ -4375,8 +4385,6 @@ } CTreeCtrl::OnKillFocus(pNewWnd); CMainFrame::GetMainFrame()->m_bModTreeHasFocus = false; - if(pNewWnd != nullptr) - CMainFrame::GetMainFrame()->SetMidiRecordWnd(pNewWnd->m_hWnd); } Modified: trunk/OpenMPT/mptrack/View_tre.h ============================================================================== --- trunk/OpenMPT/mptrack/View_tre.h Sat May 3 21:07:49 2025 (r23157) +++ trunk/OpenMPT/mptrack/View_tre.h Sat May 3 21:34:50 2025 (r23158) @@ -345,6 +345,7 @@ afx_msg void OnDropFiles(HDROP hDropInfo); afx_msg void OnKillFocus(CWnd *pNewWnd); afx_msg void OnSetFocus(CWnd *pOldWnd); + afx_msg void OnDestroy(); afx_msg void OnSetItemPath(); afx_msg void OnSaveItem(); |
From: <sv...@op...> - 2025-05-03 19:08:16
|
Author: sagamusix Date: Sat May 3 21:07:49 2025 New Revision: 23157 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23157 Log: Merged revision(s) 23156 from trunk/OpenMPT: [Imp] Allow MIDI Pitch Bend messages to not be recorded at all, always record them as macros, always as finetune, or both (https://bugs.openmpt.org/view.php?id=1874). ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/Mpdlgs.cpp branches/OpenMPT-1.32/mptrack/Mpdlgs.h branches/OpenMPT-1.32/mptrack/TrackerSettings.cpp branches/OpenMPT-1.32/mptrack/TrackerSettings.h branches/OpenMPT-1.32/mptrack/View_pat.cpp branches/OpenMPT-1.32/mptrack/mptrack.rc Modified: branches/OpenMPT-1.32/mptrack/Mpdlgs.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/Mpdlgs.cpp Sat May 3 21:07:28 2025 (r23156) +++ branches/OpenMPT-1.32/mptrack/Mpdlgs.cpp Sat May 3 21:07:49 2025 (r23157) @@ -1710,6 +1710,7 @@ ON_CBN_SELCHANGE(IDC_COMBO2, &CMidiSetupDlg::OnSettingsChanged) ON_CBN_SELCHANGE(IDC_COMBO3, &CMidiSetupDlg::OnSettingsChanged) ON_CBN_SELCHANGE(IDC_COMBO4, &CMidiSetupDlg::OnSettingsChanged) + ON_CBN_SELCHANGE(IDC_COMBO5, &CMidiSetupDlg::OnSettingsChanged) ON_COMMAND(IDC_BUTTON1, &CMidiSetupDlg::OnRenameDevice) ON_COMMAND(IDC_CHECK1, &CMidiSetupDlg::OnSettingsChanged) ON_COMMAND(IDC_CHECK2, &CMidiSetupDlg::OnSettingsChanged) @@ -1739,6 +1740,7 @@ DDX_Control(pDX, IDC_COMBO2, m_ATBehaviour); DDX_Control(pDX, IDC_COMBO3, m_Quantize); DDX_Control(pDX, IDC_COMBO4, m_ContinueMode); + DDX_Control(pDX, IDC_COMBO5, m_RecordPitchBend); DDX_Control(pDX, IDC_EDIT3, m_editAmp); //}}AFX_DATA_MAP } @@ -1766,7 +1768,6 @@ if(m_midiSetup[MidiSetup::ApplyChannelVolumeToVelocity]) CheckDlgButton(IDC_MIDIVOL_TO_NOTEVOL, BST_CHECKED); if(m_midiSetup[MidiSetup::RespondToPlayControl]) CheckDlgButton(IDC_MIDIPLAYCONTROL, BST_CHECKED); if(m_midiSetup[MidiSetup::PlayPatternOnMidiNote]) CheckDlgButton(IDC_MIDIPLAYPATTERNONMIDIIN, BST_CHECKED); - if(m_midiSetup[MidiSetup::RecordPitchBend]) CheckDlgButton(IDC_CHECK5, BST_CHECKED); // Midi In Device RefreshDeviceList(m_nMidiDevice); @@ -1778,23 +1779,43 @@ // Aftertouch behaviour m_ATBehaviour.ResetContent(); - static constexpr std::pair<const TCHAR *, RecordAftertouchOptions> aftertouchOptions[] = + static constexpr std::pair<const TCHAR *, RecordAftertouch> aftertouchOptions[] = { - { _T("Do not record Aftertouch"), atDoNotRecord }, - { _T("Record as Volume Commands"), atRecordAsVolume }, - { _T("Record as MIDI Macros"), atRecordAsMacro }, + { _T("Do not record Aftertouch"), RecordAftertouch::DoNotRecord }, + { _T("Record as Volume Commands"), RecordAftertouch::RecordAsVolume }, + { _T("Record as MIDI Macros"), RecordAftertouch::RecordAsMacro }, }; for(const auto & [str, value] : aftertouchOptions) { int item = m_ATBehaviour.AddString(str); - m_ATBehaviour.SetItemData(item, value); + m_ATBehaviour.SetItemData(item, static_cast<DWORD_PTR>(value)); if(value == TrackerSettings::Instance().aftertouchBehaviour) { m_ATBehaviour.SetCurSel(item); } } + // Pitch Bend behaviour + m_RecordPitchBend.ResetContent(); + static constexpr std::pair<const TCHAR *, RecordPitchBend> pitchBendOptions[] = + { + { _T("Do not record Pitch Bends"), RecordPitchBend::DoNotRecord }, + { _T("Record only as MIDI Macros"), RecordPitchBend::RecordAsMacro }, + { _T("Record as Finetune or MIDI Macros"), RecordPitchBend::RecordAsFinetuneOrMacro }, + { _T("Record only as Finetune"), RecordPitchBend::RecordAsFinetune }, + }; + + for (const auto & [str, value] : pitchBendOptions) + { + int item = m_RecordPitchBend.AddString(str); + m_RecordPitchBend.SetItemData(item, static_cast<DWORD_PTR>(value)); + if (value == TrackerSettings::Instance().pitchBendBehaviour) + { + m_RecordPitchBend.SetCurSel(item); + } + } + // Note Velocity amp SetDlgItemInt(IDC_EDIT3, TrackerSettings::Instance().midiVelocityAmp); m_SpinAmp.SetRange(1, 10000); @@ -1891,7 +1912,6 @@ m_midiSetup.set(MidiSetup::ApplyChannelVolumeToVelocity, IsDlgButtonChecked(IDC_MIDIVOL_TO_NOTEVOL) != BST_UNCHECKED); m_midiSetup.set(MidiSetup::RespondToPlayControl, IsDlgButtonChecked(IDC_MIDIPLAYCONTROL) != BST_UNCHECKED); m_midiSetup.set(MidiSetup::PlayPatternOnMidiNote, IsDlgButtonChecked(IDC_MIDIPLAYPATTERNONMIDIIN) != BST_UNCHECKED); - m_midiSetup.set(MidiSetup::RecordPitchBend, IsDlgButtonChecked(IDC_CHECK5) != BST_UNCHECKED); m_midiSetup.set(MidiSetup::PlayPatternFromStart, m_ContinueMode.GetCurSel() == 1); int n = m_InputDevice.GetCurSel(); @@ -1900,7 +1920,8 @@ else m_nMidiDevice = MIDI_MAPPER; - TrackerSettings::Instance().aftertouchBehaviour = static_cast<RecordAftertouchOptions>(m_ATBehaviour.GetItemData(m_ATBehaviour.GetCurSel())); + TrackerSettings::Instance().aftertouchBehaviour = static_cast<RecordAftertouch>(m_ATBehaviour.GetItemData(m_ATBehaviour.GetCurSel())); + TrackerSettings::Instance().pitchBendBehaviour = static_cast<RecordPitchBend>(m_RecordPitchBend.GetItemData(m_RecordPitchBend.GetCurSel())); TrackerSettings::Instance().midiVelocityAmp = static_cast<uint16>(Clamp(GetDlgItemInt(IDC_EDIT3), 1u, 10000u)); Modified: branches/OpenMPT-1.32/mptrack/Mpdlgs.h ============================================================================== --- branches/OpenMPT-1.32/mptrack/Mpdlgs.h Sat May 3 21:07:28 2025 (r23156) +++ branches/OpenMPT-1.32/mptrack/Mpdlgs.h Sat May 3 21:07:49 2025 (r23157) @@ -218,7 +218,7 @@ protected: CSpinButtonCtrl m_SpinSpd, m_SpinPat, m_SpinAmp; - CComboBox m_InputDevice, m_ATBehaviour, m_Quantize, m_ContinueMode; + CComboBox m_InputDevice, m_ATBehaviour, m_Quantize, m_ContinueMode, m_RecordPitchBend; AccessibleEdit m_editAmp; }; Modified: branches/OpenMPT-1.32/mptrack/TrackerSettings.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/TrackerSettings.cpp Sat May 3 21:07:28 2025 (r23156) +++ branches/OpenMPT-1.32/mptrack/TrackerSettings.cpp Sat May 3 21:07:49 2025 (r23157) @@ -248,7 +248,8 @@ , m_nMidiDevice(conf, UL_("MIDI Settings"), UL_("MidiDevice"), 0) , midiDeviceName(conf, UL_("MIDI Settings"), UL_("MidiDeviceName"), _T("")) , midiSetup(conf, UL_("MIDI Settings"), UL_("MidiSetup"), MidiSetup::Default) - , aftertouchBehaviour(conf, UL_("MIDI Settings"), UL_("AftertouchBehaviour"), atDoNotRecord) + , aftertouchBehaviour(conf, UL_("MIDI Settings"), UL_("AftertouchBehaviour"), RecordAftertouch::DoNotRecord) + , pitchBendBehaviour(conf, UL_("MIDI Settings"), UL_("PitchBendBehaviour"), RecordPitchBend::RecordAsFinetune) , midiVelocityAmp(conf, UL_("MIDI Settings"), UL_("MidiVelocityAmp"), 100) , midiIgnoreCCs(conf, UL_("MIDI Settings"), UL_("IgnoredCCs"), std::bitset<128>()) , midiImportPatternLen(conf, UL_("MIDI Settings"), UL_("MidiImportPatLen"), 128) @@ -634,12 +635,19 @@ // MIDI Settings static constexpr MidiSetup LegacyFlagAmplify2x = static_cast<MidiSetup>(0x40); + static constexpr MidiSetup LegacyRecordMidiPitchBendAsMacro = static_cast<MidiSetup>(0x400); if(midiSetup.Get()[LegacyFlagAmplify2x] && storedVersion < MPT_V("1.20.00.86")) { // This flag used to be "amplify MIDI Note Velocity" - with a fixed amplification factor of 2. midiVelocityAmp = 200; midiSetup &= ~LegacyFlagAmplify2x; } + if(midiSetup.Get()[LegacyRecordMidiPitchBendAsMacro] && storedVersion < MPT_V("1.32.00.43")) + { + // This flag used to be "Record Pitch Bend messages as MIDI macros" + pitchBendBehaviour = RecordPitchBend::RecordAsFinetuneOrMacro; + midiSetup &= ~LegacyRecordMidiPitchBendAsMacro; + } // Pattern Editor if(storedVersion < MPT_V("1.17.02.50")) Modified: branches/OpenMPT-1.32/mptrack/TrackerSettings.h ============================================================================== --- branches/OpenMPT-1.32/mptrack/TrackerSettings.h Sat May 3 21:07:28 2025 (r23156) +++ branches/OpenMPT-1.32/mptrack/TrackerSettings.h Sat May 3 21:07:49 2025 (r23157) @@ -158,7 +158,6 @@ RecordCCsAsMacros = 0x80, // Record MIDI controller changes a MIDI macro changes in pattern PlayPatternOnMidiNote = 0x100, // Play pattern if MIDI Note is received and playback is paused EnableMidiInOnStartup = 0x200, // Enable MIDI recording by default - RecordPitchBend = 0x400, // Record MIDI pitch bend messages a MIDI macro changes in pattern PlayPatternFromStart = 0x800, // When continuing playback due to received MIDI events, restart pattern instead of continuing from current row Default = RecordVelocity | RecordNoteOff | TransposeKeyboard | SendMidiToPlugins @@ -231,11 +230,19 @@ using MPTChords = std::array<MPTChord, 60>; // Size == kcCommandSetNumNotes + 1 // MIDI recording -enum RecordAftertouchOptions +enum class RecordAftertouch { - atDoNotRecord = 0, - atRecordAsVolume, - atRecordAsMacro, + DoNotRecord = 0, + RecordAsVolume, + RecordAsMacro, +}; + +enum class RecordPitchBend +{ + DoNotRecord = 0, + RecordAsMacro, + RecordAsFinetuneOrMacro, + RecordAsFinetune, }; // New file action @@ -334,8 +341,11 @@ MODTYPE SettingsStringToModType(const mpt::ustring &str); -template<> inline SettingValue ToSettingValue(const RecordAftertouchOptions &val) { return SettingValue(int32(val)); } -template<> inline RecordAftertouchOptions FromSettingValue(const SettingValue &val) { return RecordAftertouchOptions(val.as<int32>()); } +template<> inline SettingValue ToSettingValue(const RecordAftertouch &val) { return SettingValue(int32(val)); } +template<> inline RecordAftertouch FromSettingValue(const SettingValue &val) { return RecordAftertouch(val.as<int32>()); } + +template<> inline SettingValue ToSettingValue(const RecordPitchBend &val) { return SettingValue(int32(val)); } +template<> inline RecordPitchBend FromSettingValue(const SettingValue& val) { return RecordPitchBend(val.as<int32>()); } template<> inline SettingValue ToSettingValue(const SampleEditorKeyBehaviour &val) { return SettingValue(int32(val)); } template<> inline SampleEditorKeyBehaviour FromSettingValue(const SettingValue &val) { return SampleEditorKeyBehaviour(val.as<int32>()); } @@ -827,7 +837,8 @@ // accesses settings framework from in there. Work-around the ASSERTs for // now by using cached settings. CachedSetting<FlagSet<MidiSetup>> midiSetup; - CachedSetting<RecordAftertouchOptions> aftertouchBehaviour; + CachedSetting<RecordAftertouch> aftertouchBehaviour; + CachedSetting<RecordPitchBend> pitchBendBehaviour; CachedSetting<uint16> midiVelocityAmp; CachedSetting<std::bitset<128> > midiIgnoreCCs; Modified: branches/OpenMPT-1.32/mptrack/View_pat.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/View_pat.cpp Sat May 3 21:07:28 2025 (r23156) +++ branches/OpenMPT-1.32/mptrack/View_pat.cpp Sat May 3 21:07:49 2025 (r23157) @@ -4016,6 +4016,7 @@ } const FlagSet<MidiSetup> midiSetup = TrackerSettings::Instance().midiSetup; + const RecordPitchBend pitchBendBehaviour = TrackerSettings::Instance().pitchBendBehaviour; const auto &modSpecs = sndFile.GetModSpecifications(); bool recordParamAsZxx = false; @@ -4060,7 +4061,10 @@ break; case MIDIEvents::evPitchBend: // Pitch wheel - recordParamAsZxx = midiSetup[MidiSetup::RecordPitchBend] || modSpecs.HasCommand(CMD_FINETUNE); + if(modSpecs.HasCommand(CMD_FINETUNE)) + recordParamAsZxx = pitchBendBehaviour != RecordPitchBend::DoNotRecord; + else + recordParamAsZxx = pitchBendBehaviour == RecordPitchBend::RecordAsFinetuneOrMacro || pitchBendBehaviour == RecordPitchBend::RecordAsMacro; break; case MIDIEvents::evControllerChange: //Controller change @@ -4129,7 +4133,10 @@ ModCommand &m = GetModCommand(sndFile, editpos); bool update = false; - if(event == MIDIEvents::evPitchBend && (m.command == CMD_NONE || m.command == CMD_FINETUNE || m.command == CMD_FINETUNE_SMOOTH) && modSpecs.HasCommand(CMD_FINETUNE)) + if(event == MIDIEvents::evPitchBend + && (m.command == CMD_NONE || m.command == CMD_FINETUNE || m.command == CMD_FINETUNE_SMOOTH) + && modSpecs.HasCommand(CMD_FINETUNE) + && (pitchBendBehaviour == RecordPitchBend::RecordAsFinetune || pitchBendBehaviour == RecordPitchBend::RecordAsFinetuneOrMacro)) { pModDoc->GetPatternUndo().PrepareUndo(editpos.pattern, editpos.channel, editpos.row, 1, 1, "MIDI Record Entry"); m.command = (m.command == CMD_NONE) ? CMD_FINETUNE : CMD_FINETUNE_SMOOTH; @@ -4140,7 +4147,7 @@ CriticalSection cs; sndFile.ProcessFinetune(editpos.pattern, editpos.row, editpos.channel, false); } - } else if(m.IsPcNote()) + } else if(m.IsPcNote() && event != MIDIEvents::evPitchBend) { pModDoc->GetPatternUndo().PrepareUndo(editpos.pattern, editpos.channel, editpos.row, 1, 1, "MIDI Record Entry"); m.SetValueEffectCol(static_cast<decltype(m.GetValueEffectCol())>(Util::muldivr(midiByte2, ModCommand::maxColumnValue, 127))); @@ -4775,8 +4782,28 @@ case kcToggleContinueSongOnMIDINote: ToggleFlag(TrackerSettings::Instance().midiSetup, MidiSetup::PlayPatternOnMidiNote, _T("Continue Song when MIDI Note is received")); return wParam; case kcToggleContinueSongOnMIDIPlayEvents: ToggleFlag(TrackerSettings::Instance().midiSetup, MidiSetup::RespondToPlayControl, _T("Respond to Play / Continue Song MIDI messages")); return wParam; case kcToggleRecordMIDIVelocity: ToggleFlag(TrackerSettings::Instance().midiSetup, MidiSetup::RecordVelocity, _T("Record MIDI Velocity")); return wParam; - case kcToggleRecordMIDIPitchBend: ToggleFlag(TrackerSettings::Instance().midiSetup, MidiSetup::RecordPitchBend, _T("Record MIDI Pitch Bend")); return wParam; case kcToggleRecordMIDICCs: ToggleFlag(TrackerSettings::Instance().midiSetup, MidiSetup::RecordCCsAsMacros, _T("Record MIDI CCs")); return wParam; + case kcToggleRecordMIDIPitchBend: + switch(TrackerSettings::Instance().pitchBendBehaviour) + { + case RecordPitchBend::DoNotRecord: + TrackerSettings::Instance().pitchBendBehaviour = RecordPitchBend::RecordAsMacro; + CMainFrame::GetMainFrame()->SetHelpText(_T("Record MIDI Pitch Bend: Record only as MIDI Macro")); + break; + case RecordPitchBend::RecordAsMacro: + TrackerSettings::Instance().pitchBendBehaviour = RecordPitchBend::RecordAsFinetuneOrMacro; + CMainFrame::GetMainFrame()->SetHelpText(_T("Record MIDI Pitch Bend: Record as Finetune or MIDI Macro")); + break; + case RecordPitchBend::RecordAsFinetuneOrMacro: + TrackerSettings::Instance().pitchBendBehaviour = RecordPitchBend::RecordAsFinetune; + CMainFrame::GetMainFrame()->SetHelpText(_T("Record MIDI Pitch Bend: Record only as Finetune")); + break; + case RecordPitchBend::RecordAsFinetune: + TrackerSettings::Instance().pitchBendBehaviour = RecordPitchBend::DoNotRecord; + CMainFrame::GetMainFrame()->SetHelpText(_T("Record MIDI Pitch Bend: Do not Record")); + break; + } + return wParam; case kcToggleVisibilityInstrColumn: UpdateVisibileColumns(m_visibleColumns.flip(PatternCursor::instrColumn)); return wParam; case kcToggleVisibilityVolumeColumn: UpdateVisibileColumns(m_visibleColumns.flip(PatternCursor::volumeColumn)); return wParam; @@ -6104,7 +6131,7 @@ // Translate incoming MIDI aftertouch messages to pattern commands void CViewPattern::EnterAftertouch(ModCommand::NOTE note, int atValue) { - if(TrackerSettings::Instance().aftertouchBehaviour == atDoNotRecord || !IsEditingEnabled()) + if(TrackerSettings::Instance().aftertouchBehaviour == RecordAftertouch::DoNotRecord || !IsEditingEnabled()) return; const CHANNELINDEX numChannels = GetSoundFile()->GetNumChannels(); @@ -6155,10 +6182,10 @@ switch(TrackerSettings::Instance().aftertouchBehaviour) { - case atDoNotRecord: + case RecordAftertouch::DoNotRecord: break; - case atRecordAsVolume: + case RecordAftertouch::RecordAsVolume: // Record aftertouch messages as volume commands if(specs.HasVolCommand(VOLCMD_VOLUME)) { @@ -6177,7 +6204,7 @@ } break; - case atRecordAsMacro: + case RecordAftertouch::RecordAsMacro: // Record aftertouch messages as MIDI Macros if(newCommand.command == CMD_NONE || newCommand.command == CMD_SMOOTHMIDI || newCommand.command == CMD_MIDI) { Modified: branches/OpenMPT-1.32/mptrack/mptrack.rc ============================================================================== --- branches/OpenMPT-1.32/mptrack/mptrack.rc Sat May 3 21:07:28 2025 (r23156) +++ branches/OpenMPT-1.32/mptrack/mptrack.rc Sat May 3 21:07:49 2025 (r23157) @@ -1409,7 +1409,7 @@ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,84,204,12 CONTROL "&Enable MIDI recording when OpenMPT starts",IDC_CHECK3, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,96,204,12 - GROUPBOX "MIDI Recording - Volume and Controllers",IDC_STATIC,6,120,312,114 + GROUPBOX "MIDI Recording - Volume and Controllers",IDC_STATIC,6,120,312,120 CONTROL "Record Note &Off",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,138,237,8 CONTROL "Record MIDI Note &Velocity, amplify by",IDC_CHECK1, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,150,144,8 @@ -1418,23 +1418,23 @@ LTEXT "%",IDC_STATIC,207,151,48,8 CONTROL "Combine MIDI Vol&ume (CC#07) to Note Velocity",IDC_MIDIVOL_TO_NOTEVOL, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,162,258,8 - CONTROL "Recor&d Pitch Bend messages as MIDI Macro changes in pattern",IDC_CHECK5, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,174,258,8 CONTROL "Record MIDI Contro&ller changes as MIDI Macro changes in pattern",IDC_MIDI_MACRO_CONTROL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,186,258,8 - LTEXT "I&gnore CCs (e.g. 1,123,127)",IDC_STATIC,30,200,108,8 - EDITTEXT IDC_EDIT4,138,198,132,12,ES_AUTOHSCROLL - LTEXT "Record A&ftertouch Messages",IDC_STATIC,30,216,108,12,SS_CENTERIMAGE - COMBOBOX IDC_COMBO2,138,216,132,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - GROUPBOX "MIDI File Import",IDC_STATIC,6,240,312,36 - LTEXT "&Quantize:",IDC_STATIC,12,258,32,8 - COMBOBOX IDC_COMBO3,48,256,60,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Tic&ks / Row:",IDC_STATIC,114,258,42,8 - EDITTEXT IDC_EDIT1,159,256,30,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,174,258,11,14 - LTEXT "Pattern Si&ze:",IDC_STATIC,193,258,48,8 - EDITTEXT IDC_EDIT2,241,256,36,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,259,254,11,14 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,174,258,8 + LTEXT "I&gnore CCs (e.g. 1,123,127)",IDC_STATIC,30,188,108,8 + EDITTEXT IDC_EDIT4,138,186,132,12,ES_AUTOHSCROLL + LTEXT "Record A&ftertouch Messages",IDC_STATIC,30,204,108,12,SS_CENTERIMAGE + COMBOBOX IDC_COMBO2,138,204,132,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Recor&d Pitch Bend Messages",IDC_STATIC,30,222,108,12,SS_CENTERIMAGE + COMBOBOX IDC_COMBO5,138,222,132,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "MIDI File Import",IDC_STATIC,6,246,312,36 + LTEXT "&Quantize:",IDC_STATIC,12,264,32,8 + COMBOBOX IDC_COMBO3,48,262,60,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Tic&ks / Row:",IDC_STATIC,114,264,42,8 + EDITTEXT IDC_EDIT1,159,262,30,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,174,264,11,14 + LTEXT "Pattern Si&ze:",IDC_STATIC,193,264,48,8 + EDITTEXT IDC_EDIT2,241,262,36,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,259,260,11,14 END IDD_LOADRAWSAMPLE DIALOGEX 0, 0, 249, 128 |
From: <sv...@op...> - 2025-05-03 19:07:55
|
Author: sagamusix Date: Sat May 3 21:07:28 2025 New Revision: 23156 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23156 Log: [Imp] Allow MIDI Pitch Bend messages to not be recorded at all, always record them as macros, always as finetune, or both (https://bugs.openmpt.org/view.php?id=1874). Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/mptrack/Mpdlgs.h trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp Sat May 3 20:30:18 2025 (r23155) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp Sat May 3 21:07:28 2025 (r23156) @@ -1710,6 +1710,7 @@ ON_CBN_SELCHANGE(IDC_COMBO2, &CMidiSetupDlg::OnSettingsChanged) ON_CBN_SELCHANGE(IDC_COMBO3, &CMidiSetupDlg::OnSettingsChanged) ON_CBN_SELCHANGE(IDC_COMBO4, &CMidiSetupDlg::OnSettingsChanged) + ON_CBN_SELCHANGE(IDC_COMBO5, &CMidiSetupDlg::OnSettingsChanged) ON_COMMAND(IDC_BUTTON1, &CMidiSetupDlg::OnRenameDevice) ON_COMMAND(IDC_CHECK1, &CMidiSetupDlg::OnSettingsChanged) ON_COMMAND(IDC_CHECK2, &CMidiSetupDlg::OnSettingsChanged) @@ -1739,6 +1740,7 @@ DDX_Control(pDX, IDC_COMBO2, m_ATBehaviour); DDX_Control(pDX, IDC_COMBO3, m_Quantize); DDX_Control(pDX, IDC_COMBO4, m_ContinueMode); + DDX_Control(pDX, IDC_COMBO5, m_RecordPitchBend); DDX_Control(pDX, IDC_EDIT3, m_editAmp); //}}AFX_DATA_MAP } @@ -1766,7 +1768,6 @@ if(m_midiSetup[MidiSetup::ApplyChannelVolumeToVelocity]) CheckDlgButton(IDC_MIDIVOL_TO_NOTEVOL, BST_CHECKED); if(m_midiSetup[MidiSetup::RespondToPlayControl]) CheckDlgButton(IDC_MIDIPLAYCONTROL, BST_CHECKED); if(m_midiSetup[MidiSetup::PlayPatternOnMidiNote]) CheckDlgButton(IDC_MIDIPLAYPATTERNONMIDIIN, BST_CHECKED); - if(m_midiSetup[MidiSetup::RecordPitchBend]) CheckDlgButton(IDC_CHECK5, BST_CHECKED); // Midi In Device RefreshDeviceList(m_nMidiDevice); @@ -1778,23 +1779,43 @@ // Aftertouch behaviour m_ATBehaviour.ResetContent(); - static constexpr std::pair<const TCHAR *, RecordAftertouchOptions> aftertouchOptions[] = + static constexpr std::pair<const TCHAR *, RecordAftertouch> aftertouchOptions[] = { - { _T("Do not record Aftertouch"), atDoNotRecord }, - { _T("Record as Volume Commands"), atRecordAsVolume }, - { _T("Record as MIDI Macros"), atRecordAsMacro }, + { _T("Do not record Aftertouch"), RecordAftertouch::DoNotRecord }, + { _T("Record as Volume Commands"), RecordAftertouch::RecordAsVolume }, + { _T("Record as MIDI Macros"), RecordAftertouch::RecordAsMacro }, }; for(const auto & [str, value] : aftertouchOptions) { int item = m_ATBehaviour.AddString(str); - m_ATBehaviour.SetItemData(item, value); + m_ATBehaviour.SetItemData(item, static_cast<DWORD_PTR>(value)); if(value == TrackerSettings::Instance().aftertouchBehaviour) { m_ATBehaviour.SetCurSel(item); } } + // Pitch Bend behaviour + m_RecordPitchBend.ResetContent(); + static constexpr std::pair<const TCHAR *, RecordPitchBend> pitchBendOptions[] = + { + { _T("Do not record Pitch Bends"), RecordPitchBend::DoNotRecord }, + { _T("Record only as MIDI Macros"), RecordPitchBend::RecordAsMacro }, + { _T("Record as Finetune or MIDI Macros"), RecordPitchBend::RecordAsFinetuneOrMacro }, + { _T("Record only as Finetune"), RecordPitchBend::RecordAsFinetune }, + }; + + for (const auto & [str, value] : pitchBendOptions) + { + int item = m_RecordPitchBend.AddString(str); + m_RecordPitchBend.SetItemData(item, static_cast<DWORD_PTR>(value)); + if (value == TrackerSettings::Instance().pitchBendBehaviour) + { + m_RecordPitchBend.SetCurSel(item); + } + } + // Note Velocity amp SetDlgItemInt(IDC_EDIT3, TrackerSettings::Instance().midiVelocityAmp); m_SpinAmp.SetRange(1, 10000); @@ -1891,7 +1912,6 @@ m_midiSetup.set(MidiSetup::ApplyChannelVolumeToVelocity, IsDlgButtonChecked(IDC_MIDIVOL_TO_NOTEVOL) != BST_UNCHECKED); m_midiSetup.set(MidiSetup::RespondToPlayControl, IsDlgButtonChecked(IDC_MIDIPLAYCONTROL) != BST_UNCHECKED); m_midiSetup.set(MidiSetup::PlayPatternOnMidiNote, IsDlgButtonChecked(IDC_MIDIPLAYPATTERNONMIDIIN) != BST_UNCHECKED); - m_midiSetup.set(MidiSetup::RecordPitchBend, IsDlgButtonChecked(IDC_CHECK5) != BST_UNCHECKED); m_midiSetup.set(MidiSetup::PlayPatternFromStart, m_ContinueMode.GetCurSel() == 1); int n = m_InputDevice.GetCurSel(); @@ -1900,7 +1920,8 @@ else m_nMidiDevice = MIDI_MAPPER; - TrackerSettings::Instance().aftertouchBehaviour = static_cast<RecordAftertouchOptions>(m_ATBehaviour.GetItemData(m_ATBehaviour.GetCurSel())); + TrackerSettings::Instance().aftertouchBehaviour = static_cast<RecordAftertouch>(m_ATBehaviour.GetItemData(m_ATBehaviour.GetCurSel())); + TrackerSettings::Instance().pitchBendBehaviour = static_cast<RecordPitchBend>(m_RecordPitchBend.GetItemData(m_RecordPitchBend.GetCurSel())); TrackerSettings::Instance().midiVelocityAmp = static_cast<uint16>(Clamp(GetDlgItemInt(IDC_EDIT3), 1u, 10000u)); Modified: trunk/OpenMPT/mptrack/Mpdlgs.h ============================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.h Sat May 3 20:30:18 2025 (r23155) +++ trunk/OpenMPT/mptrack/Mpdlgs.h Sat May 3 21:07:28 2025 (r23156) @@ -218,7 +218,7 @@ protected: CSpinButtonCtrl m_SpinSpd, m_SpinPat, m_SpinAmp; - CComboBox m_InputDevice, m_ATBehaviour, m_Quantize, m_ContinueMode; + CComboBox m_InputDevice, m_ATBehaviour, m_Quantize, m_ContinueMode, m_RecordPitchBend; AccessibleEdit m_editAmp; }; Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp Sat May 3 20:30:18 2025 (r23155) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp Sat May 3 21:07:28 2025 (r23156) @@ -248,7 +248,8 @@ , m_nMidiDevice(conf, UL_("MIDI Settings"), UL_("MidiDevice"), 0) , midiDeviceName(conf, UL_("MIDI Settings"), UL_("MidiDeviceName"), _T("")) , midiSetup(conf, UL_("MIDI Settings"), UL_("MidiSetup"), MidiSetup::Default) - , aftertouchBehaviour(conf, UL_("MIDI Settings"), UL_("AftertouchBehaviour"), atDoNotRecord) + , aftertouchBehaviour(conf, UL_("MIDI Settings"), UL_("AftertouchBehaviour"), RecordAftertouch::DoNotRecord) + , pitchBendBehaviour(conf, UL_("MIDI Settings"), UL_("PitchBendBehaviour"), RecordPitchBend::RecordAsFinetune) , midiVelocityAmp(conf, UL_("MIDI Settings"), UL_("MidiVelocityAmp"), 100) , midiIgnoreCCs(conf, UL_("MIDI Settings"), UL_("IgnoredCCs"), std::bitset<128>()) , midiImportPatternLen(conf, UL_("MIDI Settings"), UL_("MidiImportPatLen"), 128) @@ -634,12 +635,19 @@ // MIDI Settings static constexpr MidiSetup LegacyFlagAmplify2x = static_cast<MidiSetup>(0x40); + static constexpr MidiSetup LegacyRecordMidiPitchBendAsMacro = static_cast<MidiSetup>(0x400); if(midiSetup.Get()[LegacyFlagAmplify2x] && storedVersion < MPT_V("1.20.00.86")) { // This flag used to be "amplify MIDI Note Velocity" - with a fixed amplification factor of 2. midiVelocityAmp = 200; midiSetup &= ~LegacyFlagAmplify2x; } + if(midiSetup.Get()[LegacyRecordMidiPitchBendAsMacro] && storedVersion < MPT_V("1.32.00.43")) + { + // This flag used to be "Record Pitch Bend messages as MIDI macros" + pitchBendBehaviour = RecordPitchBend::RecordAsFinetuneOrMacro; + midiSetup &= ~LegacyRecordMidiPitchBendAsMacro; + } // Pattern Editor if(storedVersion < MPT_V("1.17.02.50")) Modified: trunk/OpenMPT/mptrack/TrackerSettings.h ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h Sat May 3 20:30:18 2025 (r23155) +++ trunk/OpenMPT/mptrack/TrackerSettings.h Sat May 3 21:07:28 2025 (r23156) @@ -158,7 +158,6 @@ RecordCCsAsMacros = 0x80, // Record MIDI controller changes a MIDI macro changes in pattern PlayPatternOnMidiNote = 0x100, // Play pattern if MIDI Note is received and playback is paused EnableMidiInOnStartup = 0x200, // Enable MIDI recording by default - RecordPitchBend = 0x400, // Record MIDI pitch bend messages a MIDI macro changes in pattern PlayPatternFromStart = 0x800, // When continuing playback due to received MIDI events, restart pattern instead of continuing from current row Default = RecordVelocity | RecordNoteOff | TransposeKeyboard | SendMidiToPlugins @@ -231,11 +230,19 @@ using MPTChords = std::array<MPTChord, 60>; // Size == kcCommandSetNumNotes + 1 // MIDI recording -enum RecordAftertouchOptions +enum class RecordAftertouch { - atDoNotRecord = 0, - atRecordAsVolume, - atRecordAsMacro, + DoNotRecord = 0, + RecordAsVolume, + RecordAsMacro, +}; + +enum class RecordPitchBend +{ + DoNotRecord = 0, + RecordAsMacro, + RecordAsFinetuneOrMacro, + RecordAsFinetune, }; // New file action @@ -334,8 +341,11 @@ MODTYPE SettingsStringToModType(const mpt::ustring &str); -template<> inline SettingValue ToSettingValue(const RecordAftertouchOptions &val) { return SettingValue(int32(val)); } -template<> inline RecordAftertouchOptions FromSettingValue(const SettingValue &val) { return RecordAftertouchOptions(val.as<int32>()); } +template<> inline SettingValue ToSettingValue(const RecordAftertouch &val) { return SettingValue(int32(val)); } +template<> inline RecordAftertouch FromSettingValue(const SettingValue &val) { return RecordAftertouch(val.as<int32>()); } + +template<> inline SettingValue ToSettingValue(const RecordPitchBend &val) { return SettingValue(int32(val)); } +template<> inline RecordPitchBend FromSettingValue(const SettingValue& val) { return RecordPitchBend(val.as<int32>()); } template<> inline SettingValue ToSettingValue(const SampleEditorKeyBehaviour &val) { return SettingValue(int32(val)); } template<> inline SampleEditorKeyBehaviour FromSettingValue(const SettingValue &val) { return SampleEditorKeyBehaviour(val.as<int32>()); } @@ -827,7 +837,8 @@ // accesses settings framework from in there. Work-around the ASSERTs for // now by using cached settings. CachedSetting<FlagSet<MidiSetup>> midiSetup; - CachedSetting<RecordAftertouchOptions> aftertouchBehaviour; + CachedSetting<RecordAftertouch> aftertouchBehaviour; + CachedSetting<RecordPitchBend> pitchBendBehaviour; CachedSetting<uint16> midiVelocityAmp; CachedSetting<std::bitset<128> > midiIgnoreCCs; Modified: trunk/OpenMPT/mptrack/View_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp Sat May 3 20:30:18 2025 (r23155) +++ trunk/OpenMPT/mptrack/View_pat.cpp Sat May 3 21:07:28 2025 (r23156) @@ -4016,6 +4016,7 @@ } const FlagSet<MidiSetup> midiSetup = TrackerSettings::Instance().midiSetup; + const RecordPitchBend pitchBendBehaviour = TrackerSettings::Instance().pitchBendBehaviour; const auto &modSpecs = sndFile.GetModSpecifications(); bool recordParamAsZxx = false; @@ -4060,7 +4061,10 @@ break; case MIDIEvents::evPitchBend: // Pitch wheel - recordParamAsZxx = midiSetup[MidiSetup::RecordPitchBend] || modSpecs.HasCommand(CMD_FINETUNE); + if(modSpecs.HasCommand(CMD_FINETUNE)) + recordParamAsZxx = pitchBendBehaviour != RecordPitchBend::DoNotRecord; + else + recordParamAsZxx = pitchBendBehaviour == RecordPitchBend::RecordAsFinetuneOrMacro || pitchBendBehaviour == RecordPitchBend::RecordAsMacro; break; case MIDIEvents::evControllerChange: //Controller change @@ -4129,7 +4133,10 @@ ModCommand &m = GetModCommand(sndFile, editpos); bool update = false; - if(event == MIDIEvents::evPitchBend && (m.command == CMD_NONE || m.command == CMD_FINETUNE || m.command == CMD_FINETUNE_SMOOTH) && modSpecs.HasCommand(CMD_FINETUNE)) + if(event == MIDIEvents::evPitchBend + && (m.command == CMD_NONE || m.command == CMD_FINETUNE || m.command == CMD_FINETUNE_SMOOTH) + && modSpecs.HasCommand(CMD_FINETUNE) + && (pitchBendBehaviour == RecordPitchBend::RecordAsFinetune || pitchBendBehaviour == RecordPitchBend::RecordAsFinetuneOrMacro)) { pModDoc->GetPatternUndo().PrepareUndo(editpos.pattern, editpos.channel, editpos.row, 1, 1, "MIDI Record Entry"); m.command = (m.command == CMD_NONE) ? CMD_FINETUNE : CMD_FINETUNE_SMOOTH; @@ -4140,7 +4147,7 @@ CriticalSection cs; sndFile.ProcessFinetune(editpos.pattern, editpos.row, editpos.channel, false); } - } else if(m.IsPcNote()) + } else if(m.IsPcNote() && event != MIDIEvents::evPitchBend) { pModDoc->GetPatternUndo().PrepareUndo(editpos.pattern, editpos.channel, editpos.row, 1, 1, "MIDI Record Entry"); m.SetValueEffectCol(static_cast<decltype(m.GetValueEffectCol())>(Util::muldivr(midiByte2, ModCommand::maxColumnValue, 127))); @@ -4775,8 +4782,28 @@ case kcToggleContinueSongOnMIDINote: ToggleFlag(TrackerSettings::Instance().midiSetup, MidiSetup::PlayPatternOnMidiNote, _T("Continue Song when MIDI Note is received")); return wParam; case kcToggleContinueSongOnMIDIPlayEvents: ToggleFlag(TrackerSettings::Instance().midiSetup, MidiSetup::RespondToPlayControl, _T("Respond to Play / Continue Song MIDI messages")); return wParam; case kcToggleRecordMIDIVelocity: ToggleFlag(TrackerSettings::Instance().midiSetup, MidiSetup::RecordVelocity, _T("Record MIDI Velocity")); return wParam; - case kcToggleRecordMIDIPitchBend: ToggleFlag(TrackerSettings::Instance().midiSetup, MidiSetup::RecordPitchBend, _T("Record MIDI Pitch Bend")); return wParam; case kcToggleRecordMIDICCs: ToggleFlag(TrackerSettings::Instance().midiSetup, MidiSetup::RecordCCsAsMacros, _T("Record MIDI CCs")); return wParam; + case kcToggleRecordMIDIPitchBend: + switch(TrackerSettings::Instance().pitchBendBehaviour) + { + case RecordPitchBend::DoNotRecord: + TrackerSettings::Instance().pitchBendBehaviour = RecordPitchBend::RecordAsMacro; + CMainFrame::GetMainFrame()->SetHelpText(_T("Record MIDI Pitch Bend: Record only as MIDI Macro")); + break; + case RecordPitchBend::RecordAsMacro: + TrackerSettings::Instance().pitchBendBehaviour = RecordPitchBend::RecordAsFinetuneOrMacro; + CMainFrame::GetMainFrame()->SetHelpText(_T("Record MIDI Pitch Bend: Record as Finetune or MIDI Macro")); + break; + case RecordPitchBend::RecordAsFinetuneOrMacro: + TrackerSettings::Instance().pitchBendBehaviour = RecordPitchBend::RecordAsFinetune; + CMainFrame::GetMainFrame()->SetHelpText(_T("Record MIDI Pitch Bend: Record only as Finetune")); + break; + case RecordPitchBend::RecordAsFinetune: + TrackerSettings::Instance().pitchBendBehaviour = RecordPitchBend::DoNotRecord; + CMainFrame::GetMainFrame()->SetHelpText(_T("Record MIDI Pitch Bend: Do not Record")); + break; + } + return wParam; case kcToggleVisibilityInstrColumn: UpdateVisibileColumns(m_visibleColumns.flip(PatternCursor::instrColumn)); return wParam; case kcToggleVisibilityVolumeColumn: UpdateVisibileColumns(m_visibleColumns.flip(PatternCursor::volumeColumn)); return wParam; @@ -6104,7 +6131,7 @@ // Translate incoming MIDI aftertouch messages to pattern commands void CViewPattern::EnterAftertouch(ModCommand::NOTE note, int atValue) { - if(TrackerSettings::Instance().aftertouchBehaviour == atDoNotRecord || !IsEditingEnabled()) + if(TrackerSettings::Instance().aftertouchBehaviour == RecordAftertouch::DoNotRecord || !IsEditingEnabled()) return; const CHANNELINDEX numChannels = GetSoundFile()->GetNumChannels(); @@ -6155,10 +6182,10 @@ switch(TrackerSettings::Instance().aftertouchBehaviour) { - case atDoNotRecord: + case RecordAftertouch::DoNotRecord: break; - case atRecordAsVolume: + case RecordAftertouch::RecordAsVolume: // Record aftertouch messages as volume commands if(specs.HasVolCommand(VOLCMD_VOLUME)) { @@ -6177,7 +6204,7 @@ } break; - case atRecordAsMacro: + case RecordAftertouch::RecordAsMacro: // Record aftertouch messages as MIDI Macros if(newCommand.command == CMD_NONE || newCommand.command == CMD_SMOOTHMIDI || newCommand.command == CMD_MIDI) { Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Sat May 3 20:30:18 2025 (r23155) +++ trunk/OpenMPT/mptrack/mptrack.rc Sat May 3 21:07:28 2025 (r23156) @@ -1409,7 +1409,7 @@ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,84,204,12 CONTROL "&Enable MIDI recording when OpenMPT starts",IDC_CHECK3, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,96,204,12 - GROUPBOX "MIDI Recording - Volume and Controllers",IDC_STATIC,6,120,312,114 + GROUPBOX "MIDI Recording - Volume and Controllers",IDC_STATIC,6,120,312,120 CONTROL "Record Note &Off",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,138,237,8 CONTROL "Record MIDI Note &Velocity, amplify by",IDC_CHECK1, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,150,144,8 @@ -1418,23 +1418,23 @@ LTEXT "%",IDC_STATIC,207,151,48,8 CONTROL "Combine MIDI Vol&ume (CC#07) to Note Velocity",IDC_MIDIVOL_TO_NOTEVOL, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,162,258,8 - CONTROL "Recor&d Pitch Bend messages as MIDI Macro changes in pattern",IDC_CHECK5, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,174,258,8 CONTROL "Record MIDI Contro&ller changes as MIDI Macro changes in pattern",IDC_MIDI_MACRO_CONTROL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,186,258,8 - LTEXT "I&gnore CCs (e.g. 1,123,127)",IDC_STATIC,30,200,108,8 - EDITTEXT IDC_EDIT4,138,198,132,12,ES_AUTOHSCROLL - LTEXT "Record A&ftertouch Messages",IDC_STATIC,30,216,108,12,SS_CENTERIMAGE - COMBOBOX IDC_COMBO2,138,216,132,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - GROUPBOX "MIDI File Import",IDC_STATIC,6,240,312,36 - LTEXT "&Quantize:",IDC_STATIC,12,258,32,8 - COMBOBOX IDC_COMBO3,48,256,60,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Tic&ks / Row:",IDC_STATIC,114,258,42,8 - EDITTEXT IDC_EDIT1,159,256,30,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,174,258,11,14 - LTEXT "Pattern Si&ze:",IDC_STATIC,193,258,48,8 - EDITTEXT IDC_EDIT2,241,256,36,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,259,254,11,14 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,174,258,8 + LTEXT "I&gnore CCs (e.g. 1,123,127)",IDC_STATIC,30,188,108,8 + EDITTEXT IDC_EDIT4,138,186,132,12,ES_AUTOHSCROLL + LTEXT "Record A&ftertouch Messages",IDC_STATIC,30,204,108,12,SS_CENTERIMAGE + COMBOBOX IDC_COMBO2,138,204,132,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Recor&d Pitch Bend Messages",IDC_STATIC,30,222,108,12,SS_CENTERIMAGE + COMBOBOX IDC_COMBO5,138,222,132,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "MIDI File Import",IDC_STATIC,6,246,312,36 + LTEXT "&Quantize:",IDC_STATIC,12,264,32,8 + COMBOBOX IDC_COMBO3,48,262,60,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Tic&ks / Row:",IDC_STATIC,114,264,42,8 + EDITTEXT IDC_EDIT1,159,262,30,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,174,264,11,14 + LTEXT "Pattern Si&ze:",IDC_STATIC,193,264,48,8 + EDITTEXT IDC_EDIT2,241,262,36,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,259,260,11,14 END IDD_LOADRAWSAMPLE DIALOGEX 0, 0, 249, 128 |
From: <sv...@op...> - 2025-05-03 18:30:41
|
Author: sagamusix Date: Sat May 3 20:30:18 2025 New Revision: 23155 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23155 Log: Merged revision(s) 23154 from trunk/OpenMPT: [Fix] When creating a new, empty module, reset channel state. Otherwise, whole row preview won't work until song playback has been restarted at least once (https://bugs.openmpt.org/view.php?id=1879). ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/Moddoc.cpp Modified: branches/OpenMPT-1.32/mptrack/Moddoc.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/Moddoc.cpp Sat May 3 20:29:41 2025 (r23154) +++ branches/OpenMPT-1.32/mptrack/Moddoc.cpp Sat May 3 20:30:18 2025 (r23155) @@ -692,6 +692,8 @@ } m_SndFile.m_songArtist = TrackerSettings::Instance().defaultArtist; + + m_SndFile.ResetPlayPos(); } |
From: <sv...@op...> - 2025-05-03 18:30:14
|
Author: sagamusix Date: Sat May 3 20:29:41 2025 New Revision: 23154 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23154 Log: [Fix] When creating a new, empty module, reset channel state. Otherwise, whole row preview won't work until song playback has been restarted at least once (https://bugs.openmpt.org/view.php?id=1879). Modified: trunk/OpenMPT/mptrack/Moddoc.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp Sat May 3 19:54:38 2025 (r23153) +++ trunk/OpenMPT/mptrack/Moddoc.cpp Sat May 3 20:29:41 2025 (r23154) @@ -692,6 +692,8 @@ } m_SndFile.m_songArtist = TrackerSettings::Instance().defaultArtist; + + m_SndFile.ResetPlayPos(); } |
From: <sv...@op...> - 2025-05-03 17:55:06
|
Author: sagamusix Date: Sat May 3 19:54:38 2025 New Revision: 23153 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23153 Log: Merged revision(s) 23152 from trunk/OpenMPT: [Imp] Make "Display rows / orders in hex" setting also work for accessible announcements (https://bugs.openmpt.org/view.php?id=1876). [Fix] Order list: After inserting orders, update status bar and accessible announcement text. ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/Ctrl_seq.cpp branches/OpenMPT-1.32/mptrack/Mptrack.cpp branches/OpenMPT-1.32/mptrack/Mptrack.h branches/OpenMPT-1.32/mptrack/View_pat.cpp Modified: branches/OpenMPT-1.32/mptrack/Ctrl_seq.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/Ctrl_seq.cpp Sat May 3 19:54:17 2025 (r23152) +++ branches/OpenMPT-1.32/mptrack/Ctrl_seq.cpp Sat May 3 19:54:38 2025 (r23153) @@ -735,9 +735,9 @@ const bool singleSel = m_nScrollPos2nd == ORDERINDEX_INVALID || m_nScrollPos2nd == m_nScrollPos; const auto firstOrd = singleSel ? m_nScrollPos : std::min(m_nScrollPos, m_nScrollPos2nd), lastOrd = singleSel ? m_nScrollPos : std::max(m_nScrollPos, m_nScrollPos2nd); if(singleSel) - s = MPT_CFORMAT("Order {}, ")(m_nScrollPos); + s = MPT_CFORMAT("Order {}, ")(FormatOrderRow(m_nScrollPos)); else - s = MPT_CFORMAT("Order selection {} to {}: ")(firstOrd, lastOrd); + s = MPT_CFORMAT("Order selection {} to {}: ")(FormatOrderRow(firstOrd), FormatOrderRow(lastOrd)); bool first = true; for(ORDERINDEX o = firstOrd; o <= lastOrd; o++) { @@ -1296,6 +1296,7 @@ Invalidate(FALSE); m_modDoc.SetModified(); m_modDoc.UpdateAllViews(nullptr, SequenceHint().Data(), this); + UpdateInfoText(); } Modified: branches/OpenMPT-1.32/mptrack/Mptrack.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/Mptrack.cpp Sat May 3 19:54:17 2025 (r23152) +++ branches/OpenMPT-1.32/mptrack/Mptrack.cpp Sat May 3 19:54:38 2025 (r23153) @@ -2133,6 +2133,16 @@ } +CString FormatOrderRow(uint32 value) +{ + const bool rowAndOrderNumbersHex = TrackerSettings::Instance().patternSetup & PatternSetup::RowAndOrderNumbersHex; + if(rowAndOrderNumbersHex) + return mpt::cfmt::HEX0<2>(value); + else + return mpt::cfmt::val(value); +} + + //////////////////////////////////////////////////////////////////////////////// // CFastBitmap 8-bit output / 4-bit input // useful for lots of small blits with color mapping Modified: branches/OpenMPT-1.32/mptrack/Mptrack.h ============================================================================== --- branches/OpenMPT-1.32/mptrack/Mptrack.h Sat May 3 19:54:17 2025 (r23152) +++ branches/OpenMPT-1.32/mptrack/Mptrack.h Sat May 3 19:54:38 2025 (r23153) @@ -446,6 +446,8 @@ CString FormatFileSize(uint64 fileSize); +CString FormatOrderRow(uint32 value); + bool ValidateMacroString(CEdit &wnd, const std::string_view prevMacro, bool isParametric, bool allowVariables, bool allowMultiline); mpt::ustring ConstructSampleFormatFileFilter(bool includeRaw); Modified: branches/OpenMPT-1.32/mptrack/View_pat.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/View_pat.cpp Sat May 3 19:54:17 2025 (r23152) +++ branches/OpenMPT-1.32/mptrack/View_pat.cpp Sat May 3 19:54:38 2025 (r23153) @@ -7659,9 +7659,9 @@ CString str = TrackerSettings::Instance().patternAccessibilityFormat; str.Replace(_T("%sequence%"), mpt::cfmt::val(sndFile->Order.GetCurrentSequenceIndex())); - str.Replace(_T("%order%"), mpt::cfmt::val(GetCurrentOrder())); + str.Replace(_T("%order%"), FormatOrderRow(GetCurrentOrder())); str.Replace(_T("%pattern%"), mpt::cfmt::val(GetCurrentPattern())); - str.Replace(_T("%row%"), mpt::cfmt::val(m_Cursor.GetRow())); + str.Replace(_T("%row%"), FormatOrderRow(m_Cursor.GetRow())); str.Replace(_T("%channel%"), channelNumber); str.Replace(_T("%column_type%"), column); str.Replace(_T("%column_description%"), GetCursorDescription()); |
From: <sv...@op...> - 2025-05-03 17:54:42
|
Author: sagamusix Date: Sat May 3 19:54:17 2025 New Revision: 23152 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23152 Log: [Imp] Make "Display rows / orders in hex" setting also work for accessible announcements (https://bugs.openmpt.org/view.php?id=1876). [Fix] Order list: After inserting orders, update status bar and accessible announcement text. Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/View_pat.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp Sat May 3 19:05:58 2025 (r23151) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp Sat May 3 19:54:17 2025 (r23152) @@ -735,9 +735,9 @@ const bool singleSel = m_nScrollPos2nd == ORDERINDEX_INVALID || m_nScrollPos2nd == m_nScrollPos; const auto firstOrd = singleSel ? m_nScrollPos : std::min(m_nScrollPos, m_nScrollPos2nd), lastOrd = singleSel ? m_nScrollPos : std::max(m_nScrollPos, m_nScrollPos2nd); if(singleSel) - s = MPT_CFORMAT("Order {}, ")(m_nScrollPos); + s = MPT_CFORMAT("Order {}, ")(FormatOrderRow(m_nScrollPos)); else - s = MPT_CFORMAT("Order selection {} to {}: ")(firstOrd, lastOrd); + s = MPT_CFORMAT("Order selection {} to {}: ")(FormatOrderRow(firstOrd), FormatOrderRow(lastOrd)); bool first = true; for(ORDERINDEX o = firstOrd; o <= lastOrd; o++) { @@ -1296,6 +1296,7 @@ Invalidate(FALSE); m_modDoc.SetModified(); m_modDoc.UpdateAllViews(nullptr, SequenceHint().Data(), this); + UpdateInfoText(); } Modified: trunk/OpenMPT/mptrack/Mptrack.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp Sat May 3 19:05:58 2025 (r23151) +++ trunk/OpenMPT/mptrack/Mptrack.cpp Sat May 3 19:54:17 2025 (r23152) @@ -2133,6 +2133,16 @@ } +CString FormatOrderRow(uint32 value) +{ + const bool rowAndOrderNumbersHex = TrackerSettings::Instance().patternSetup & PatternSetup::RowAndOrderNumbersHex; + if(rowAndOrderNumbersHex) + return mpt::cfmt::HEX0<2>(value); + else + return mpt::cfmt::val(value); +} + + //////////////////////////////////////////////////////////////////////////////// // CFastBitmap 8-bit output / 4-bit input // useful for lots of small blits with color mapping Modified: trunk/OpenMPT/mptrack/Mptrack.h ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h Sat May 3 19:05:58 2025 (r23151) +++ trunk/OpenMPT/mptrack/Mptrack.h Sat May 3 19:54:17 2025 (r23152) @@ -446,6 +446,8 @@ CString FormatFileSize(uint64 fileSize); +CString FormatOrderRow(uint32 value); + bool ValidateMacroString(CEdit &wnd, const std::string_view prevMacro, bool isParametric, bool allowVariables, bool allowMultiline); mpt::ustring ConstructSampleFormatFileFilter(bool includeRaw); Modified: trunk/OpenMPT/mptrack/View_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp Sat May 3 19:05:58 2025 (r23151) +++ trunk/OpenMPT/mptrack/View_pat.cpp Sat May 3 19:54:17 2025 (r23152) @@ -7659,9 +7659,9 @@ CString str = TrackerSettings::Instance().patternAccessibilityFormat; str.Replace(_T("%sequence%"), mpt::cfmt::val(sndFile->Order.GetCurrentSequenceIndex())); - str.Replace(_T("%order%"), mpt::cfmt::val(GetCurrentOrder())); + str.Replace(_T("%order%"), FormatOrderRow(GetCurrentOrder())); str.Replace(_T("%pattern%"), mpt::cfmt::val(GetCurrentPattern())); - str.Replace(_T("%row%"), mpt::cfmt::val(m_Cursor.GetRow())); + str.Replace(_T("%row%"), FormatOrderRow(m_Cursor.GetRow())); str.Replace(_T("%channel%"), channelNumber); str.Replace(_T("%column_type%"), column); str.Replace(_T("%column_description%"), GetCursorDescription()); |
From: <sv...@op...> - 2025-05-03 17:06:20
|
Author: sagamusix Date: Sat May 3 19:05:58 2025 New Revision: 23151 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23151 Log: Merged revision(s) 23150 from trunk/OpenMPT: [Imp] Mod Conversion: When converting from XM, drop Offset commands that would not be doing anything. ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/soundlib/modcommand.cpp Modified: branches/OpenMPT-1.32/soundlib/modcommand.cpp ============================================================================== --- branches/OpenMPT-1.32/soundlib/modcommand.cpp Sat May 3 19:05:37 2025 (r23150) +++ branches/OpenMPT-1.32/soundlib/modcommand.cpp Sat May 3 19:05:58 2025 (r23151) @@ -926,6 +926,10 @@ command = CMD_XFINEPORTAUPDOWN; } + // Offset effect memory is only updated when the command is placed next to a note. + if(oldTypeIsXM && command == CMD_OFFSET && !IsNote()) + command = CMD_NONE; + if((command == CMD_REVERSEOFFSET || command == CMD_OFFSETPERCENTAGE) && !newSpecs.HasCommand(command)) { command = CMD_OFFSET; |
From: <sv...@op...> - 2025-05-03 17:06:07
|
Author: sagamusix Date: Sat May 3 19:05:37 2025 New Revision: 23150 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23150 Log: [Imp] Mod Conversion: When converting from XM, drop Offset commands that would not be doing anything. Modified: trunk/OpenMPT/soundlib/modcommand.cpp Modified: trunk/OpenMPT/soundlib/modcommand.cpp ============================================================================== --- trunk/OpenMPT/soundlib/modcommand.cpp Sat May 3 18:24:40 2025 (r23149) +++ trunk/OpenMPT/soundlib/modcommand.cpp Sat May 3 19:05:37 2025 (r23150) @@ -926,6 +926,10 @@ command = CMD_XFINEPORTAUPDOWN; } + // Offset effect memory is only updated when the command is placed next to a note. + if(oldTypeIsXM && command == CMD_OFFSET && !IsNote()) + command = CMD_NONE; + if((command == CMD_REVERSEOFFSET || command == CMD_OFFSETPERCENTAGE) && !newSpecs.HasCommand(command)) { command = CMD_OFFSET; |
From: <sv...@op...> - 2025-05-03 16:25:07
|
Author: sagamusix Date: Sat May 3 18:24:40 2025 New Revision: 23149 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23149 Log: Merged revision(s) 23148 from trunk/OpenMPT: [Fix] XM: Only update Offset effect memory when the command is next to a note. Test case: OffsetWithoutNote.xm (tx cyrb) [Mod] OpenMPT: Version is now 1.32.00.43 ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/common/versionNumber.h branches/OpenMPT-1.32/mptrack/dlg_misc.cpp branches/OpenMPT-1.32/soundlib/Snd_defs.h branches/OpenMPT-1.32/soundlib/Snd_fx.cpp branches/OpenMPT-1.32/soundlib/Sndfile.cpp branches/OpenMPT-1.32/soundlib/UpgradeModule.cpp Modified: branches/OpenMPT-1.32/common/versionNumber.h ============================================================================== --- branches/OpenMPT-1.32/common/versionNumber.h Sat May 3 18:24:02 2025 (r23148) +++ branches/OpenMPT-1.32/common/versionNumber.h Sat May 3 18:24:40 2025 (r23149) @@ -16,4 +16,4 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 32 #define VER_MINOR 00 -#define VER_MINORMINOR 42 +#define VER_MINORMINOR 43 Modified: branches/OpenMPT-1.32/mptrack/dlg_misc.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/dlg_misc.cpp Sat May 3 18:24:02 2025 (r23148) +++ branches/OpenMPT-1.32/mptrack/dlg_misc.cpp Sat May 3 18:24:40 2025 (r23149) @@ -753,6 +753,7 @@ case kLegacyPPQpos: desc = _T("Report inaccurate PPQ position to VST plugins (like OpenMPT 1.31 and older)"); break; case kLegacyPluginNNABehaviour: desc = _T("Plugin notes with New Note Action set to Continue are affected by note-offs (like OpenMPT 1.31 and older)"); break; case kITCarryAfterNoteOff: desc = _T("Note-Off status does not influence Envelope Carry behaviour"); break; + case kFT2OffsetMemoryRequiresNote: desc = _T("Offset effect memory is only updated when the command is next to a note"); break; default: MPT_ASSERT_NOTREACHED(); } Modified: branches/OpenMPT-1.32/soundlib/Snd_defs.h ============================================================================== --- branches/OpenMPT-1.32/soundlib/Snd_defs.h Sat May 3 18:24:02 2025 (r23148) +++ branches/OpenMPT-1.32/soundlib/Snd_defs.h Sat May 3 18:24:40 2025 (r23149) @@ -616,6 +616,7 @@ kLegacyPPQpos, // Report fake PPQ position to VST plugins kLegacyPluginNNABehaviour, // Plugin notes with NNA=continue are affected by note-offs etc. kITCarryAfterNoteOff, // Envelope Carry continues to function as normal even after note-off + kFT2OffsetMemoryRequiresNote, // Offset memory is only updated when offset command is next to a note // Add new play behaviours here. Modified: branches/OpenMPT-1.32/soundlib/Snd_fx.cpp ============================================================================== --- branches/OpenMPT-1.32/soundlib/Snd_fx.cpp Sat May 3 18:24:02 2025 (r23148) +++ branches/OpenMPT-1.32/soundlib/Snd_fx.cpp Sat May 3 18:24:40 2025 (r23149) @@ -5656,7 +5656,9 @@ // No X-param (normal behaviour) const bool isPercentageOffset = (m.volcmd == VOLCMD_OFFSET && m.vol == 0); offset <<= 8; - if(offset) + // FT2 compatibility: 9xx command without a note next to it does not update effect memory. + // Test case: OffsetWithoutNote.xm + if(offset && (!m_playBehaviour[kFT2OffsetMemoryRequiresNote] || m.IsNote())) chn.oldOffset = offset; else if(m.volcmd != VOLCMD_OFFSET) offset = chn.oldOffset; Modified: branches/OpenMPT-1.32/soundlib/Sndfile.cpp ============================================================================== --- branches/OpenMPT-1.32/soundlib/Sndfile.cpp Sat May 3 18:24:02 2025 (r23148) +++ branches/OpenMPT-1.32/soundlib/Sndfile.cpp Sat May 3 18:24:40 2025 (r23149) @@ -1269,6 +1269,7 @@ playBehaviour.set(kFT2NoteDelayWithoutInstr); playBehaviour.set(kFT2PortaResetDirection); playBehaviour.set(kFT2AutoVibratoAbortSweep); + playBehaviour.set(kFT2OffsetMemoryRequiresNote); break; case MOD_TYPE_S3M: Modified: branches/OpenMPT-1.32/soundlib/UpgradeModule.cpp ============================================================================== --- branches/OpenMPT-1.32/soundlib/UpgradeModule.cpp Sat May 3 18:24:02 2025 (r23148) +++ branches/OpenMPT-1.32/soundlib/UpgradeModule.cpp Sat May 3 18:24:40 2025 (r23149) @@ -627,6 +627,7 @@ { kITFT2DontResetNoteOffOnPorta, MPT_V("1.29.00.34") }, { kFT2PortaResetDirection, MPT_V("1.30.00.40") }, { kFT2AutoVibratoAbortSweep, MPT_V("1.32.00.29") }, + { kFT2OffsetMemoryRequiresNote, MPT_V("1.32.00.43") }, }; for(const auto &b : behaviours) |
From: <sv...@op...> - 2025-05-03 16:24:29
|
Author: sagamusix Date: Sat May 3 18:24:02 2025 New Revision: 23148 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23148 Log: [Fix] XM: Only update Offset effect memory when the command is next to a note. Test case: OffsetWithoutNote.xm (tx cyrb) [Mod] OpenMPT: Version is now 1.33.00.02 Modified: trunk/OpenMPT/common/versionNumber.h trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/UpgradeModule.cpp Modified: trunk/OpenMPT/common/versionNumber.h ============================================================================== --- trunk/OpenMPT/common/versionNumber.h Sat May 3 18:23:32 2025 (r23147) +++ trunk/OpenMPT/common/versionNumber.h Sat May 3 18:24:02 2025 (r23148) @@ -16,4 +16,4 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 33 #define VER_MINOR 00 -#define VER_MINORMINOR 01 +#define VER_MINORMINOR 02 Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp ============================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp Sat May 3 18:23:32 2025 (r23147) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp Sat May 3 18:24:02 2025 (r23148) @@ -753,6 +753,7 @@ case kLegacyPPQpos: desc = _T("Report inaccurate PPQ position to VST plugins (like OpenMPT 1.31 and older)"); break; case kLegacyPluginNNABehaviour: desc = _T("Plugin notes with New Note Action set to Continue are affected by note-offs (like OpenMPT 1.31 and older)"); break; case kITCarryAfterNoteOff: desc = _T("Note-Off status does not influence Envelope Carry behaviour"); break; + case kFT2OffsetMemoryRequiresNote: desc = _T("Offset effect memory is only updated when the command is next to a note"); break; default: MPT_ASSERT_NOTREACHED(); } Modified: trunk/OpenMPT/soundlib/Snd_defs.h ============================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h Sat May 3 18:23:32 2025 (r23147) +++ trunk/OpenMPT/soundlib/Snd_defs.h Sat May 3 18:24:02 2025 (r23148) @@ -616,6 +616,7 @@ kLegacyPPQpos, // Report fake PPQ position to VST plugins kLegacyPluginNNABehaviour, // Plugin notes with NNA=continue are affected by note-offs etc. kITCarryAfterNoteOff, // Envelope Carry continues to function as normal even after note-off + kFT2OffsetMemoryRequiresNote, // Offset memory is only updated when offset command is next to a note // Add new play behaviours here. Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp Sat May 3 18:23:32 2025 (r23147) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp Sat May 3 18:24:02 2025 (r23148) @@ -5656,7 +5656,9 @@ // No X-param (normal behaviour) const bool isPercentageOffset = (m.volcmd == VOLCMD_OFFSET && m.vol == 0); offset <<= 8; - if(offset) + // FT2 compatibility: 9xx command without a note next to it does not update effect memory. + // Test case: OffsetWithoutNote.xm + if(offset && (!m_playBehaviour[kFT2OffsetMemoryRequiresNote] || m.IsNote())) chn.oldOffset = offset; else if(m.volcmd != VOLCMD_OFFSET) offset = chn.oldOffset; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp Sat May 3 18:23:32 2025 (r23147) +++ trunk/OpenMPT/soundlib/Sndfile.cpp Sat May 3 18:24:02 2025 (r23148) @@ -1269,6 +1269,7 @@ playBehaviour.set(kFT2NoteDelayWithoutInstr); playBehaviour.set(kFT2PortaResetDirection); playBehaviour.set(kFT2AutoVibratoAbortSweep); + playBehaviour.set(kFT2OffsetMemoryRequiresNote); break; case MOD_TYPE_S3M: Modified: trunk/OpenMPT/soundlib/UpgradeModule.cpp ============================================================================== --- trunk/OpenMPT/soundlib/UpgradeModule.cpp Sat May 3 18:23:32 2025 (r23147) +++ trunk/OpenMPT/soundlib/UpgradeModule.cpp Sat May 3 18:24:02 2025 (r23148) @@ -627,6 +627,7 @@ { kITFT2DontResetNoteOffOnPorta, MPT_V("1.29.00.34") }, { kFT2PortaResetDirection, MPT_V("1.30.00.40") }, { kFT2AutoVibratoAbortSweep, MPT_V("1.32.00.29") }, + { kFT2OffsetMemoryRequiresNote, MPT_V("1.32.00.43") }, }; for(const auto &b : behaviours) |
From: <sv...@op...> - 2025-05-03 16:24:01
|
Author: sagamusix Date: Sat May 3 18:23:32 2025 New Revision: 23147 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23147 Log: Merged revision(s) 23146 from trunk/OpenMPT: [Fix] Quick Channel Settings: Avoid setting keyboard focus to disabled input item for MOD/S3M files (https://bugs.openmpt.org/view.php?id=1880). [Fix] Quick Channel Settings: Accessible dialog title was not updated when navigating to another channel (https://bugs.openmpt.org/view.php?id=1880). ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/DialogBase.cpp branches/OpenMPT-1.32/mptrack/DialogBase.h branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.cpp Modified: branches/OpenMPT-1.32/mptrack/DialogBase.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/DialogBase.cpp Fri May 2 17:11:09 2025 (r23146) +++ branches/OpenMPT-1.32/mptrack/DialogBase.cpp Sat May 3 18:23:32 2025 (r23147) @@ -63,6 +63,21 @@ } +void DialogBase::SetFocusToFirstControl() +{ + CWnd *child = GetWindow(GW_CHILD); + while(child) + { + if((child->GetStyle() & WS_TABSTOP) && child->IsWindowEnabled()) + { + child->SetFocus(); + return; + } + child = child->GetNextWindow(); + } +} + + LRESULT DialogBase::OnDPIChanged(WPARAM, LPARAM) { // We may receive a first WM_DPICHANGED before OnInitDialog() even runs. We don't want to tell our dialogs about a DPI "change" that early. Modified: branches/OpenMPT-1.32/mptrack/DialogBase.h ============================================================================== --- branches/OpenMPT-1.32/mptrack/DialogBase.h Fri May 2 17:11:09 2025 (r23146) +++ branches/OpenMPT-1.32/mptrack/DialogBase.h Sat May 3 18:23:32 2025 (r23147) @@ -28,6 +28,8 @@ int GetDPI() const { return m_dpi; } + void SetFocusToFirstControl(); + protected: virtual void OnDPIChanged() {} void UpdateDPI(); Modified: branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.cpp Fri May 2 17:11:09 2025 (r23146) +++ branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.cpp Sat May 3 18:23:32 2025 (r23147) @@ -1346,8 +1346,6 @@ m_panSlider.SetRange(0, 64); m_panSlider.SetTicFreq(8); m_panSpin.SetRange(0, 256); - - m_nameEdit.SetFocus(); } m_document = modDoc; m_channel = chn; @@ -1363,8 +1361,6 @@ Clamp(static_cast<int>(position.y) - rect.Height() / 2, 0, static_cast<int>(screenRect.bottom) - rect.Height())); MoveWindow(rect); - SetWindowText(MPT_TFORMAT("Settings for Channel {}")(chn + 1).c_str()); - UpdateDisplay(); const BOOL enablePan = (m_document->GetModType() & (MOD_TYPE_XM | MOD_TYPE_MOD)) ? FALSE : TRUE; @@ -1384,6 +1380,7 @@ // Channel name m_nameEdit.EnableWindow((m_document->GetModType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM)) ? TRUE : FALSE); + SetFocusToFirstControl(); ShowWindow(SW_SHOW); m_visible = true; } @@ -1391,6 +1388,8 @@ void QuickChannelProperties::UpdateDisplay() { + SetWindowText(MPT_TFORMAT("Settings for Channel {}")(m_channel + 1).c_str()); + // Set up channel properties m_visible = false; const ModChannelSettings &settings = m_document->GetSoundFile().ChnSettings[m_channel]; |
From: <sv...@op...> - 2025-05-02 15:11:42
|
Author: sagamusix Date: Fri May 2 17:11:09 2025 New Revision: 23146 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23146 Log: [Fix] Quick Channel Settings: Avoid setting keyboard focus to disabled input item for MOD/S3M files (https://bugs.openmpt.org/view.php?id=1880). [Fix] Quick Channel Settings: Accessible dialog title was not updated when navigating to another channel (https://bugs.openmpt.org/view.php?id=1880). Modified: trunk/OpenMPT/mptrack/DialogBase.cpp trunk/OpenMPT/mptrack/DialogBase.h trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Modified: trunk/OpenMPT/mptrack/DialogBase.cpp ============================================================================== --- trunk/OpenMPT/mptrack/DialogBase.cpp Sat Apr 19 07:02:55 2025 (r23145) +++ trunk/OpenMPT/mptrack/DialogBase.cpp Fri May 2 17:11:09 2025 (r23146) @@ -63,6 +63,21 @@ } +void DialogBase::SetFocusToFirstControl() +{ + CWnd *child = GetWindow(GW_CHILD); + while(child) + { + if((child->GetStyle() & WS_TABSTOP) && child->IsWindowEnabled()) + { + child->SetFocus(); + return; + } + child = child->GetNextWindow(); + } +} + + LRESULT DialogBase::OnDPIChanged(WPARAM, LPARAM) { // We may receive a first WM_DPICHANGED before OnInitDialog() even runs. We don't want to tell our dialogs about a DPI "change" that early. Modified: trunk/OpenMPT/mptrack/DialogBase.h ============================================================================== --- trunk/OpenMPT/mptrack/DialogBase.h Sat Apr 19 07:02:55 2025 (r23145) +++ trunk/OpenMPT/mptrack/DialogBase.h Fri May 2 17:11:09 2025 (r23146) @@ -28,6 +28,8 @@ int GetDPI() const { return m_dpi; } + void SetFocusToFirstControl(); + protected: virtual void OnDPIChanged() {} void UpdateDPI(); Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Sat Apr 19 07:02:55 2025 (r23145) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Fri May 2 17:11:09 2025 (r23146) @@ -1346,8 +1346,6 @@ m_panSlider.SetRange(0, 64); m_panSlider.SetTicFreq(8); m_panSpin.SetRange(0, 256); - - m_nameEdit.SetFocus(); } m_document = modDoc; m_channel = chn; @@ -1363,8 +1361,6 @@ Clamp(static_cast<int>(position.y) - rect.Height() / 2, 0, static_cast<int>(screenRect.bottom) - rect.Height())); MoveWindow(rect); - SetWindowText(MPT_TFORMAT("Settings for Channel {}")(chn + 1).c_str()); - UpdateDisplay(); const BOOL enablePan = (m_document->GetModType() & (MOD_TYPE_XM | MOD_TYPE_MOD)) ? FALSE : TRUE; @@ -1384,6 +1380,7 @@ // Channel name m_nameEdit.EnableWindow((m_document->GetModType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM)) ? TRUE : FALSE); + SetFocusToFirstControl(); ShowWindow(SW_SHOW); m_visible = true; } @@ -1391,6 +1388,8 @@ void QuickChannelProperties::UpdateDisplay() { + SetWindowText(MPT_TFORMAT("Settings for Channel {}")(m_channel + 1).c_str()); + // Set up channel properties m_visible = false; const ModChannelSettings &settings = m_document->GetSoundFile().ChnSettings[m_channel]; |
From: <sv...@op...> - 2025-04-19 05:03:22
|
Author: manx Date: Sat Apr 19 07:02:55 2025 New Revision: 23145 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23145 Log: Merged revision(s) 23143 from trunk/OpenMPT: [Fix] build: CI: GitHub: Fedora: Do not try to install pcc. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/.github/workflows/Fedora-Autotools.yml branches/OpenMPT-1.31/.github/workflows/Fedora-Cross-MinGW.yml branches/OpenMPT-1.31/.github/workflows/Fedora-Makefile.yml Modified: branches/OpenMPT-1.31/.github/workflows/Fedora-Autotools.yml ============================================================================== --- branches/OpenMPT-1.31/.github/workflows/Fedora-Autotools.yml Sat Apr 19 07:02:32 2025 (r23144) +++ branches/OpenMPT-1.31/.github/workflows/Fedora-Autotools.yml Sat Apr 19 07:02:55 2025 (r23145) @@ -17,7 +17,7 @@ steps: - name: Install dependencies - run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pcc pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel + run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel - name: Checkout uses: actions/checkout@v4 - name: fix git Modified: branches/OpenMPT-1.31/.github/workflows/Fedora-Cross-MinGW.yml ============================================================================== --- branches/OpenMPT-1.31/.github/workflows/Fedora-Cross-MinGW.yml Sat Apr 19 07:02:32 2025 (r23144) +++ branches/OpenMPT-1.31/.github/workflows/Fedora-Cross-MinGW.yml Sat Apr 19 07:02:55 2025 (r23145) @@ -25,7 +25,7 @@ steps: - name: Install dependencies - run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pcc pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel + run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel - name: Install mingw run: dnf -y install mingw32-filesystem mingw64-filesystem ucrt64-filesystem mingw-w64-tools mingw32-binutils mingw64-binutils ucrt64-binutils mingw32-gcc mingw32-gcc-c++ mingw64-gcc mingw64-gcc-c++ ucrt64-gcc ucrt64-gcc-c++ mingw32-windows-default-manifest mingw64-windows-default-manifest - name: Checkout Modified: branches/OpenMPT-1.31/.github/workflows/Fedora-Makefile.yml ============================================================================== --- branches/OpenMPT-1.31/.github/workflows/Fedora-Makefile.yml Sat Apr 19 07:02:32 2025 (r23144) +++ branches/OpenMPT-1.31/.github/workflows/Fedora-Makefile.yml Sat Apr 19 07:02:55 2025 (r23145) @@ -25,7 +25,7 @@ steps: - name: Install dependencies - run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pcc pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel + run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel - name: Checkout uses: actions/checkout@v4 - name: fix git |
From: <sv...@op...> - 2025-04-19 05:02:59
|
Author: manx Date: Sat Apr 19 07:02:32 2025 New Revision: 23144 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23144 Log: Merged revision(s) 23143 from trunk/OpenMPT: [Fix] build: CI: GitHub: Fedora: Do not try to install pcc. ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/.github/workflows/Fedora-Autotools.yml branches/OpenMPT-1.32/.github/workflows/Fedora-Cross-MinGW.yml branches/OpenMPT-1.32/.github/workflows/Fedora-Makefile.yml Modified: branches/OpenMPT-1.32/.github/workflows/Fedora-Autotools.yml ============================================================================== --- branches/OpenMPT-1.32/.github/workflows/Fedora-Autotools.yml Sat Apr 19 07:02:05 2025 (r23143) +++ branches/OpenMPT-1.32/.github/workflows/Fedora-Autotools.yml Sat Apr 19 07:02:32 2025 (r23144) @@ -17,7 +17,7 @@ steps: - name: Install dependencies - run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pcc pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel + run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel - name: Checkout uses: actions/checkout@v4 - name: fix git Modified: branches/OpenMPT-1.32/.github/workflows/Fedora-Cross-MinGW.yml ============================================================================== --- branches/OpenMPT-1.32/.github/workflows/Fedora-Cross-MinGW.yml Sat Apr 19 07:02:05 2025 (r23143) +++ branches/OpenMPT-1.32/.github/workflows/Fedora-Cross-MinGW.yml Sat Apr 19 07:02:32 2025 (r23144) @@ -25,7 +25,7 @@ steps: - name: Install dependencies - run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pcc pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel + run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel - name: Install mingw run: dnf -y install mingw32-filesystem mingw64-filesystem ucrt64-filesystem mingw-w64-tools mingw32-binutils mingw64-binutils ucrt64-binutils mingw32-gcc mingw32-gcc-c++ mingw64-gcc mingw64-gcc-c++ ucrt64-gcc ucrt64-gcc-c++ mingw32-windows-default-manifest mingw64-windows-default-manifest - name: Checkout Modified: branches/OpenMPT-1.32/.github/workflows/Fedora-Makefile.yml ============================================================================== --- branches/OpenMPT-1.32/.github/workflows/Fedora-Makefile.yml Sat Apr 19 07:02:05 2025 (r23143) +++ branches/OpenMPT-1.32/.github/workflows/Fedora-Makefile.yml Sat Apr 19 07:02:32 2025 (r23144) @@ -25,7 +25,7 @@ steps: - name: Install dependencies - run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pcc pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel + run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel - name: Checkout uses: actions/checkout@v4 - name: fix git |
From: <sv...@op...> - 2025-04-19 05:02:28
|
Author: manx Date: Sat Apr 19 07:02:05 2025 New Revision: 23143 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23143 Log: [Fix] build: CI: GitHub: Fedora: Do not try to install pcc. Modified: trunk/OpenMPT/.github/workflows/Fedora-Autotools.yml trunk/OpenMPT/.github/workflows/Fedora-Cross-MinGW.yml trunk/OpenMPT/.github/workflows/Fedora-Makefile.yml Modified: trunk/OpenMPT/.github/workflows/Fedora-Autotools.yml ============================================================================== --- trunk/OpenMPT/.github/workflows/Fedora-Autotools.yml Fri Apr 18 15:14:05 2025 (r23142) +++ trunk/OpenMPT/.github/workflows/Fedora-Autotools.yml Sat Apr 19 07:02:05 2025 (r23143) @@ -19,7 +19,7 @@ steps: - name: Install dependencies - run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pcc pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel + run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel - name: Checkout uses: actions/checkout@v4 - name: fix git Modified: trunk/OpenMPT/.github/workflows/Fedora-Cross-MinGW.yml ============================================================================== --- trunk/OpenMPT/.github/workflows/Fedora-Cross-MinGW.yml Fri Apr 18 15:14:05 2025 (r23142) +++ trunk/OpenMPT/.github/workflows/Fedora-Cross-MinGW.yml Sat Apr 19 07:02:05 2025 (r23143) @@ -27,7 +27,7 @@ steps: - name: Install dependencies - run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pcc pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel + run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel - name: Install mingw run: dnf -y install mingw32-filesystem mingw64-filesystem ucrt64-filesystem mingw-w64-tools mingw32-binutils mingw64-binutils ucrt64-binutils mingw32-gcc mingw32-gcc-c++ mingw64-gcc mingw64-gcc-c++ ucrt64-gcc ucrt64-gcc-c++ mingw32-windows-default-manifest mingw64-windows-default-manifest - name: Checkout Modified: trunk/OpenMPT/.github/workflows/Fedora-Makefile.yml ============================================================================== --- trunk/OpenMPT/.github/workflows/Fedora-Makefile.yml Fri Apr 18 15:14:05 2025 (r23142) +++ trunk/OpenMPT/.github/workflows/Fedora-Makefile.yml Sat Apr 19 07:02:05 2025 (r23143) @@ -27,7 +27,7 @@ steps: - name: Install dependencies - run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pcc pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel + run: dnf -y upgrade --refresh && dnf -y install subversion perl-XML-XPath git mawk zip unzip p7zip xz make binutils gcc gcc-g++ clang pkgconf help2man doxygen autoconf autoconf-archive automake libtool ccache zlib-devel mpg123-devel libogg-devel libvorbis-devel portaudio-devel pulseaudio-libs-devel SDL2-devel flac-devel libsndfile-devel libtool-ltdl-devel - name: Checkout uses: actions/checkout@v4 - name: fix git |