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
(213) |
Aug
(203) |
Sep
(148) |
Oct
(109) |
Nov
(191) |
Dec
(209) |
| 2026 |
Jan
(127) |
Feb
(123) |
Mar
(160) |
Apr
(141) |
May
(45) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <sag...@us...> - 2009-09-23 11:51:37
|
Revision: 376
http://modplug.svn.sourceforge.net/modplug/?rev=376&view=rev
Author: saga-games
Date: 2009-09-23 11:51:18 +0000 (Wed, 23 Sep 2009)
Log Message:
-----------
Added Paths:
-----------
branches/devBranch_1_17_04/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-22 17:07:29
|
Revision: 375
http://modplug.svn.sourceforge.net/modplug/?rev=375&view=rev
Author: saga-games
Date: 2009-09-22 17:07:04 +0000 (Tue, 22 Sep 2009)
Log Message:
-----------
[Mod] Compatibility Export: Use module working directory in "save as" dialog
[Fix] Color Setup: When no INI file was present, channel separators were completely black
[Fix] MED Loader: Possible error when loading orderlist
Modified Paths:
--------------
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/mptrack/misc_util.h
trunk/OpenMPT/soundlib/Load_med.cpp
Removed Paths:
-------------
trunk/OpenMPT/mptrack/bin/default.mkb
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-21 20:03:46 UTC (rev 374)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-22 17:07:04 UTC (rev 375)
@@ -255,6 +255,8 @@
0x800000, 0x808000, 0x008000, 0x808000, 0x008080, 0x000080, 0xFF0000,
// VU-Meters
0x00FF00, 0x00FFFF, 0x0000FF,
+ // Channel separators
+ GetSysColor(COLOR_BTNSHADOW), GetSysColor(COLOR_BTNFACE), GetSysColor(COLOR_BTNHIGHLIGHT),
};
// Directory Arrays (Default + Last)
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-21 20:03:46 UTC (rev 374)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-22 17:07:04 UTC (rev 375)
@@ -1635,6 +1635,8 @@
CFileDialog dlg(FALSE, ext, s,
OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN,
pattern, pMainFrm);
+ dlg.m_ofn.lpstrInitialDir = CMainFrame::GetWorkingDirectory(DIR_MODS);
+
if (dlg.DoModal() != IDOK){
return;
}
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-21 20:03:46 UTC (rev 374)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-22 17:07:04 UTC (rev 375)
@@ -742,6 +742,8 @@
MoveConfigFile("plugin.cache");
MoveConfigFile("mpt_intl.ini");
MoveConfigFile("default.mkb", "", "Keybindings.mkb");
+ MoveConfigFile("Keybindings.mkb");
+ // TODO - Check the old ini settings here
}
// Create tunings dir
Deleted: trunk/OpenMPT/mptrack/bin/default.mkb
===================================================================
--- trunk/OpenMPT/mptrack/bin/default.mkb 2009-09-21 20:03:46 UTC (rev 374)
+++ trunk/OpenMPT/mptrack/bin/default.mkb 2009-09-22 17:07:04 UTC (rev 375)
@@ -1,282 +0,0 @@
-//-------- OpenMPT key binding definition file -------
-//-Format is: -
-//- Context:Command ID:Modifiers:Key:KeypressEventType //Comments -
-//----------------------------------------------------------------------
-
-//----( Global Context (0) )------------
-0:1347:2:78:1 //File/New: Ctrl+N (KeyDown)
-0:1346:2:79:1 //File/Open: Ctrl+O (KeyDown)
-0:1349:2:83:1 //File/Save: Ctrl+S (KeyDown)
-0:1030:2:119:1 //Play song/Pause song: Ctrl+F8 (KeyDown)
-0:1031:0:119:1 //Pause song: F8 (KeyDown)
-0:1375:0:27:1 //Stop Song: ESC (KeyDown)
-0:1029:0:116:5 //Play song from start: F5 (KeyDown|KeyHold)
-0:1028:0:118:5 //Play song from cursor: F7 (KeyDown|KeyHold)
-0:1027:0:117:5 //Play pattern from start: F6 (KeyDown|KeyHold)
-0:1026:2:117:5 //Play pattern from cursor: Ctrl+F6 (KeyDown|KeyHold)
-0:1687:6:66:1 //Show approx. real BPM: Ctrl+Alt+B (KeyDown)
-0:1376:2:120:1 //Toggle Midi Record: Ctrl+F9 (KeyDown)
-0:1359:2:90:1 //Undo: Ctrl+Z (KeyDown)
-0:1360:2:88:1 //Cut: Ctrl+X (KeyDown)
-0:1361:2:67:1 //Copy: Ctrl+C (KeyDown)
-0:1361:4:67:1 //Copy: Alt+C (KeyDown)
-0:1362:2:86:1 //Paste: Ctrl+V (KeyDown)
-0:1362:4:86:1 //Paste: Alt+V (KeyDown)
-0:1363:2:77:1 //Mix Paste: Ctrl+M (KeyDown)
-0:1364:2:65:1 //SelectAll: Ctrl+A (KeyDown)
-0:1365:2:70:1 //Find: Ctrl+F (KeyDown)
-0:1366:2:114:1 //Find Next: Ctrl+F3 (KeyDown)
-0:1021:0:122:1 //View General: F11 (KeyDown)
-0:1022:0:113:1 //View Pattern: F2 (KeyDown)
-0:1023:0:114:1 //View Samples: F3 (KeyDown)
-0:1024:0:115:1 //View Instruments: F4 (KeyDown)
-0:1025:1:120:1 //View Comments: Shift+F9 (KeyDown)
-0:1368:2:113:1 //Toggle Tree View: Ctrl+F2 (KeyDown)
-0:1369:2:112:1 //View Options: Ctrl+F1 (KeyDown)
-0:1670:6:77:1 //View Channel Manager: Ctrl+Alt+M (KeyDown)
-0:1669:3:77:1 //View 'Add Plugin' Window: Shift+Ctrl+M (KeyDown)
-0:1032:0:219:5 //Previous instrument: [ (KeyDown|KeyHold)
-0:1032:2:38:5 //Previous instrument: Ctrl+UP (KeyDown|KeyHold)
-0:1033:0:221:5 //Next instrument: ] (KeyDown|KeyHold)
-0:1033:2:40:5 //Next instrument: Ctrl+DOWN (KeyDown|KeyHold)
-0:1036:0:111:5 //Previous octave: NUM DIVIDE (KeyDown|KeyHold)
-0:1037:0:106:5 //Next octave: NUMMULT (KeyDown|KeyHold)
-0:1034:2:37:5 //Previous order: Ctrl+LEFT (KeyDown|KeyHold)
-0:1035:2:39:5 //Next order: Ctrl+RIGHT (KeyDown|KeyHold)
-0:1201:0:223:1 //Note off: ` (KeyDown)
-
-//----( General Context [bottom] (1) )------------
-
-//----( Pattern Context [bottom] (2) )------------
-2:1017:0:34:5 //Jump down by measure: PGDOWN (KeyDown|KeyHold)
-2:1018:0:33:5 //Jump up by measure: PGUP (KeyDown|KeyHold)
-2:1338:4:34:5 //Jump down by beat: Alt+PGDOWN (KeyDown|KeyHold)
-2:1339:4:33:5 //Jump up by beat: Alt+PGUP (KeyDown|KeyHold)
-2:1019:2:34:5 //Snap down to measure: Ctrl+PGDOWN (KeyDown|KeyHold)
-2:1020:2:33:5 //Snap up to measure: Ctrl+PGUP (KeyDown|KeyHold)
-2:1340:6:34:5 //Snap down to beat: Ctrl+Alt+PGDOWN (KeyDown|KeyHold)
-2:1341:6:33:5 //Snap up to beat: Ctrl+Alt+PGUP (KeyDown|KeyHold)
-2:1038:0:40:5 //Navigate down by 1 row: DOWN (KeyDown|KeyHold)
-2:1039:0:38:5 //Navigate up by 1 row: UP (KeyDown|KeyHold)
-2:1040:0:37:5 //Navigate left: LEFT (KeyDown|KeyHold)
-2:1041:0:39:5 //Navigate right: RIGHT (KeyDown|KeyHold)
-2:1042:0:9:5 //Navigate to next channel: TAB (KeyDown|KeyHold)
-2:1043:2:9:5 //Navigate to previous channel: Ctrl+TAB (KeyDown|KeyHold)
-2:1044:0:36:1 //Go to first channel: HOME (KeyDown)
-2:1045:2:36:1 //Go to first row: Ctrl+HOME (KeyDown)
-2:1046:6:36:1 //Go to first row of first channel: Ctrl+Alt+HOME (KeyDown)
-2:1047:0:35:1 //Go to last channel: END (KeyDown)
-2:1048:2:35:1 //Go to last row: Ctrl+END (KeyDown)
-2:1049:6:35:1 //Go to last row of last channel: Ctrl+Alt+END (KeyDown)
-2:1050:1:16:1 //Selection key: Shift (KeyDown)
-2:1011:4:76:1 //Select channel / Select all: Alt+L (KeyDown)
-2:1663:2:118:1 //Toggle follow song: Ctrl+F7 (KeyDown)
-2:1003:0:13:1 //Quick copy: ENTER (KeyDown)
-2:1004:0:32:5 //Quick paste: SPACE (KeyDown|KeyHold)
-2:1001:1:120:1 //Enable recording: Shift+F9 (KeyDown)
-2:1002:2:13:1 //Play row: Ctrl+ENTER (KeyDown)
-2:1002:0:104:1 //Play row: NUM 8 (KeyDown)
-2:1002:0:56:1 //Play row: 8 (KeyDown)
-2:1317:4:18:1 //Set row jump on note entry: Alt (KeyDown)
-2:1685:6:9:1 //Switch to order list: Ctrl+Alt+TAB (KeyDown)
-2:1672:3:13:1 //Insert new pattern: Shift+Ctrl+ENTER (KeyDown)
-2:1662:6:80:1 //Toggle channel's plugin editor: Ctrl+Alt+P (KeyDown)
-2:1062:0:93:1 //Show note properties: Application (KeyDown)
-2:1063:2:93:1 //Show context (right-click) menu: Ctrl+Application (KeyDown)
-2:1005:0:120:1 //Mute current channel: F9 (KeyDown)
-2:1006:0:121:1 //Solo current channel: F10 (KeyDown)
-2:1007:4:81:5 //Transpose +1: Alt+Q (KeyDown|KeyHold)
-2:1008:4:65:5 //Transpose -1: Alt+A (KeyDown|KeyHold)
-2:1009:6:81:5 //Transpose +12: Ctrl+Alt+Q (KeyDown|KeyHold)
-2:1010:6:65:5 //Transpose -12: Ctrl+Alt+A (KeyDown|KeyHold)
-2:1012:4:74:1 //Amplify selection: Alt+J (KeyDown)
-2:1014:4:73:1 //Interpolate volume: Alt+I (KeyDown)
-2:1015:4:88:1 //Interpolate effect: Alt+X (KeyDown)
-2:1016:4:66:1 //Open effect visualizer: Alt+B (KeyDown)
-2:1013:4:83:1 //Apply current instrument: Alt+S (KeyDown)
-2:1660:4:69:1 //Grow selection: Alt+E (KeyDown)
-2:1661:4:68:1 //Shrink selection: Alt+D (KeyDown)
-2:1057:0:46:1 //Clear row: DELETE (KeyDown)
-2:1058:0:110:1 //Clear field: NUM DECIMAL (KeyDown)
-2:1664:1:190:1 //Clear field (IT Style): Shift+. (KeyDown)
-2:1059:2:46:1 //Clear row and step: Ctrl+DELETE (KeyDown)
-2:1060:2:110:1 //Clear field and step: Ctrl+NUM DECIMAL (KeyDown)
-2:1665:3:190:1 //Clear field and step (IT Style): Shift+Ctrl+. (KeyDown)
-2:1061:0:8:5 //Delete rows: BACKSPACE (KeyDown|KeyHold)
-2:1377:2:8:5 //Delete all rows: Ctrl+BACKSPACE (KeyDown|KeyHold)
-2:1378:0:45:5 //Insert Row: INSERT (KeyDown|KeyHold)
-2:1379:2:45:1 //Insert All Rows: Ctrl+INSERT (KeyDown)
-2:1055:0:109:5 //Previous pattern: NUM SUB (KeyDown|KeyHold)
-2:1054:0:107:5 //Next pattern: NUM PLUS (KeyDown|KeyHold)
-
-//----( Pattern Context [bottom] - Note Col (3) )------------
-3:1064:0:90:1 //Base octave C: Z (KeyDown)
-3:1065:0:83:1 //Base octave C#: S (KeyDown)
-3:1066:0:88:1 //Base octave D: X (KeyDown)
-3:1067:0:68:1 //Base octave D#: D (KeyDown)
-3:1068:0:67:1 //Base octave E: C (KeyDown)
-3:1069:0:86:1 //Base octave F: V (KeyDown)
-3:1070:0:71:1 //Base octave F#: G (KeyDown)
-3:1071:0:66:1 //Base octave G: B (KeyDown)
-3:1072:0:72:1 //Base octave G#: H (KeyDown)
-3:1073:0:78:1 //Base octave +1 A: N (KeyDown)
-3:1074:0:74:1 //Base octave +1 A#: J (KeyDown)
-3:1075:0:77:1 //Base octave +1 B: M (KeyDown)
-3:1076:0:81:1 //Base octave +1 C: Q (KeyDown)
-3:1077:0:50:1 //Base octave +1 C#: 2 (KeyDown)
-3:1078:0:87:1 //Base octave +1 D: W (KeyDown)
-3:1079:0:51:1 //Base octave +1 D#: 3 (KeyDown)
-3:1080:0:69:1 //Base octave +1 E: E (KeyDown)
-3:1081:0:82:1 //Base octave +1 F: R (KeyDown)
-3:1082:0:53:1 //Base octave +1 F#: 5 (KeyDown)
-3:1083:0:84:1 //Base octave +1 G: T (KeyDown)
-3:1084:0:54:1 //Base octave +1 G#: 6 (KeyDown)
-3:1085:0:89:1 //Base octave +2 A: Y (KeyDown)
-3:1086:0:55:1 //Base octave +2 A#: 7 (KeyDown)
-3:1087:0:85:1 //Base octave +2 B: U (KeyDown)
-3:1088:0:73:1 //Base octave +2 C: I (KeyDown)
-3:1089:0:57:1 //Base octave +2 C#: 9 (KeyDown)
-3:1090:0:79:1 //Base octave +2 D: O (KeyDown)
-3:1091:0:48:1 //Base octave +2 D#: 0 (KeyDown)
-3:1092:0:80:1 //Base octave +2 E: P (KeyDown)
-3:1212:0:96:1 //Set octave 0: NUM 0 (KeyDown)
-3:1213:0:97:1 //Set octave 1: NUM 1 (KeyDown)
-3:1214:0:98:1 //Set octave 2: NUM 2 (KeyDown)
-3:1215:0:99:1 //Set octave 3: NUM 3 (KeyDown)
-3:1216:0:52:1 //Set octave 4: 4 (KeyDown)
-3:1216:0:100:1 //Set octave 4: NUM 4 (KeyDown)
-3:1217:0:101:1 //Set octave 5: NUM 5 (KeyDown)
-3:1218:0:102:1 //Set octave 6: NUM 6 (KeyDown)
-3:1219:0:103:1 //Set octave 7: NUM 7 (KeyDown)
-3:1220:0:104:1 //Set octave 8: NUM 8 (KeyDown)
-3:1221:0:105:1 //Set octave 9: NUM 9 (KeyDown)
-3:1316:1:16:1 //Chord Modifier: Shift (KeyDown)
-3:1200:0:49:1 //Note cut: 1 (KeyDown)
-3:1201:0:187:1 //Note off: = (KeyDown)
-3:1667:1:49:1 //Note cut (don't remember instrument): Shift+1 (KeyDown)
-3:1668:1:223:1 //Note off (don't remember instrument): Shift+` (KeyDown)
-
-//----( Pattern Context [bottom] - Ins Col (4) )------------
-4:1202:0:96:1 //Set instrument digit 0: NUM 0 (KeyDown)
-4:1202:0:48:1 //Set instrument digit 0: 0 (KeyDown)
-4:1203:0:97:1 //Set instrument digit 1: NUM 1 (KeyDown)
-4:1203:0:49:1 //Set instrument digit 1: 1 (KeyDown)
-4:1204:0:98:1 //Set instrument digit 2: NUM 2 (KeyDown)
-4:1204:0:50:1 //Set instrument digit 2: 2 (KeyDown)
-4:1205:0:99:1 //Set instrument digit 3: NUM 3 (KeyDown)
-4:1205:0:51:1 //Set instrument digit 3: 3 (KeyDown)
-4:1206:0:100:1 //Set instrument digit 4: NUM 4 (KeyDown)
-4:1206:0:52:1 //Set instrument digit 4: 4 (KeyDown)
-4:1207:0:101:1 //Set instrument digit 5: NUM 5 (KeyDown)
-4:1207:0:53:1 //Set instrument digit 5: 5 (KeyDown)
-4:1208:0:102:1 //Set instrument digit 6: NUM 6 (KeyDown)
-4:1208:0:54:1 //Set instrument digit 6: 6 (KeyDown)
-4:1209:0:103:1 //Set instrument digit 7: NUM 7 (KeyDown)
-4:1209:0:55:1 //Set instrument digit 7: 7 (KeyDown)
-4:1210:0:56:1 //Set instrument digit 8: 8 (KeyDown)
-4:1210:0:104:1 //Set instrument digit 8: NUM 8 (KeyDown)
-4:1211:0:105:1 //Set instrument digit 9: NUM 9 (KeyDown)
-4:1211:0:57:1 //Set instrument digit 9: 9 (KeyDown)
-
-//----( Pattern Context [bottom] - Vol Col (5) )------------
-5:1222:0:48:1 //Set volume digit 0: 0 (KeyDown)
-5:1222:0:96:1 //Set volume digit 0: NUM 0 (KeyDown)
-5:1223:0:49:1 //Set volume digit 1: 1 (KeyDown)
-5:1223:0:97:1 //Set volume digit 1: NUM 1 (KeyDown)
-5:1224:0:50:1 //Set volume digit 2: 2 (KeyDown)
-5:1224:0:98:1 //Set volume digit 2: NUM 2 (KeyDown)
-5:1225:0:51:1 //Set volume digit 3: 3 (KeyDown)
-5:1225:0:99:1 //Set volume digit 3: NUM 3 (KeyDown)
-5:1226:0:52:1 //Set volume digit 4: 4 (KeyDown)
-5:1226:0:100:1 //Set volume digit 4: NUM 4 (KeyDown)
-5:1227:0:53:1 //Set volume digit 5: 5 (KeyDown)
-5:1227:0:101:1 //Set volume digit 5: NUM 5 (KeyDown)
-5:1228:0:54:1 //Set volume digit 6: 6 (KeyDown)
-5:1228:0:102:1 //Set volume digit 6: NUM 6 (KeyDown)
-5:1229:0:55:1 //Set volume digit 7: 7 (KeyDown)
-5:1229:0:103:1 //Set volume digit 7: NUM 7 (KeyDown)
-5:1230:0:56:1 //Set volume digit 8: 8 (KeyDown)
-5:1230:0:104:1 //Set volume digit 8: NUM 8 (KeyDown)
-5:1231:0:57:1 //Set volume digit 9: 9 (KeyDown)
-5:1231:0:105:1 //Set volume digit 9: NUM 9 (KeyDown)
-5:1232:0:86:1 //Vol command - volume: V (KeyDown)
-5:1233:0:80:1 //Vol command - pan: P (KeyDown)
-5:1234:0:67:1 //Vol command - vol slide up: C (KeyDown)
-5:1235:0:68:1 //Vol command - vol slide down: D (KeyDown)
-5:1236:0:65:1 //Vol command - vol fine slide up: A (KeyDown)
-5:1237:0:66:1 //Vol command - vol fine slide down: B (KeyDown)
-5:1238:0:85:1 //Vol command - vibrato speed: U (KeyDown)
-5:1239:0:72:1 //Vol command - vibrato: H (KeyDown)
-5:1240:0:76:1 //Vol command - XM pan left: L (KeyDown)
-5:1241:0:82:1 //Vol command - XM pan right: R (KeyDown)
-5:1242:0:71:1 //Vol command - Portamento: G (KeyDown)
-5:1243:0:70:1 //Vol command - Portamento Up: F (KeyDown)
-5:1244:0:69:1 //Vol command - Portamento Down: E (KeyDown)
-5:1245:1:186:1 //Vol command - Velocity: Shift+; (KeyDown)
-5:1246:0:79:1 //Vol command - Offset: O (KeyDown)
-
-//----( Pattern Context [bottom] - FX Col (6) )------------
-6:1294:0:220:1 //FX midi macro slide: \ (KeyDown)
-6:1295:1:186:1 //FX pseudo-velocity (experimental): Shift+; (KeyDown)
-6:1666:0:222:1 //FX parameter extension command: # (KeyDown)
-
-//----( Pattern Context [bottom] - Param Col (7) )------------
-7:1247:0:48:1 //FX Param digit 0: 0 (KeyDown)
-7:1247:0:96:1 //FX Param digit 0: NUM 0 (KeyDown)
-7:1248:0:49:1 //FX Param digit 1: 1 (KeyDown)
-7:1248:0:97:1 //FX Param digit 1: NUM 1 (KeyDown)
-7:1249:0:50:1 //FX Param digit 2: 2 (KeyDown)
-7:1249:0:98:1 //FX Param digit 2: NUM 2 (KeyDown)
-7:1250:0:51:1 //FX Param digit 3: 3 (KeyDown)
-7:1250:0:99:1 //FX Param digit 3: NUM 3 (KeyDown)
-7:1251:0:52:1 //FX Param digit 4: 4 (KeyDown)
-7:1251:0:100:1 //FX Param digit 4: NUM 4 (KeyDown)
-7:1252:0:53:1 //FX Param digit 5: 5 (KeyDown)
-7:1252:0:101:1 //FX Param digit 5: NUM 5 (KeyDown)
-7:1253:0:54:1 //FX Param digit 6: 6 (KeyDown)
-7:1253:0:102:1 //FX Param digit 6: NUM 6 (KeyDown)
-7:1254:0:55:1 //FX Param digit 7: 7 (KeyDown)
-7:1254:0:103:1 //FX Param digit 7: NUM 7 (KeyDown)
-7:1255:0:56:1 //FX Param digit 8: 8 (KeyDown)
-7:1255:0:104:1 //FX Param digit 8: NUM 8 (KeyDown)
-7:1256:0:57:1 //FX Param digit 9: 9 (KeyDown)
-7:1256:0:105:1 //FX Param digit 9: NUM 9 (KeyDown)
-7:1257:0:65:1 //FX Param digit A: A (KeyDown)
-7:1258:0:66:1 //FX Param digit B: B (KeyDown)
-7:1259:0:67:1 //FX Param digit C: C (KeyDown)
-7:1260:0:68:1 //FX Param digit D: D (KeyDown)
-7:1261:0:69:1 //FX Param digit E: E (KeyDown)
-7:1262:0:70:1 //FX Param digit F: F (KeyDown)
-
-//----( Sample Context [bottom] (8) )------------
-8:1673:4:76:1 //Load a Sample: Alt+L (KeyDown)
-8:1674:4:83:1 //Save Sample: Alt+S (KeyDown)
-8:1675:4:78:1 //New Sample: Alt+N (KeyDown)
-8:1380:2:84:1 //Trim sample around loop points: Ctrl+T (KeyDown)
-8:1383:0:8:1 //Silence sample selection: BACKSPACE (KeyDown)
-8:1384:3:78:1 //Normalise Sample: Shift+Ctrl+N (KeyDown)
-8:1385:3:65:1 //Amplify Sample: Shift+Ctrl+A (KeyDown)
-8:1381:3:82:1 //Reverse sample: Shift+Ctrl+R (KeyDown)
-8:1382:0:46:1 //Delete sample selection: DELETE (KeyDown)
-8:1386:0:107:1 //Zoom Out: NUM PLUS (KeyDown)
-8:1387:0:109:1 //Zoom In: NUM SUB (KeyDown)
-
-//----( Instrument Context [bottom] (9) )------------
-
-//----( Comments Context [bottom] (10) )------------
-
-//----( Unknown Context (11) )------------
-
-//----( Unknown Context (12) )------------
-
-//----( Plugin GUI Context (13) )------------
-
-//----( General Context [top] (14) )------------
-
-//----( Pattern Context [top] (15) )------------
-
-//----( Sample Context [top] (16) )------------
-
-//----( Instrument Context [top] (17) )------------
-
-//----( Comments Context [top] (18) )------------
Modified: trunk/OpenMPT/mptrack/misc_util.h
===================================================================
--- trunk/OpenMPT/mptrack/misc_util.h 2009-09-21 20:03:46 UTC (rev 374)
+++ trunk/OpenMPT/mptrack/misc_util.h 2009-09-22 17:07:04 UTC (rev 375)
@@ -135,4 +135,30 @@
}
}
+// Convert a 0-terminated string to a space-padded string
+template <size_t size>
+void NullToSpaceString(char (&buffer)[size])
+{
+ size_t pos = size;
+ while (pos-- > 0)
+ if (buffer[pos] == 0)
+ buffer[pos] = 32;
+ buffer[size - 1] = 0;
+}
+// Convert a space-padded string to a 0-terminated string
+template <size_t size>
+void SpaceToNullString(char (&buffer)[size])
+{
+ // First, remove any Nulls
+ NullToSpaceString(buffer);
+ size_t pos = size;
+ while (pos-- > 0)
+ {
+ if (buffer[pos] == 32)
+ buffer[pos] = 0;
+ else if(buffer[pos] != 0)
+ break;
+ }
+ buffer[size - 1] = 0;
+}
#endif
Modified: trunk/OpenMPT/soundlib/Load_med.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_med.cpp 2009-09-21 20:03:46 UTC (rev 374)
+++ trunk/OpenMPT/soundlib/Load_med.cpp 2009-09-22 17:07:04 UTC (rev 375)
@@ -673,7 +673,7 @@
Order.resize(nOrders++);
for (UINT i=0; i<n; i++)
{
- WORD seqval = BigEndian(pmps->seq[i]);
+ WORD seqval = BigEndianW(pmps->seq[i]);
if ((seqval < wNumBlocks) && (nOrders < MAX_ORDERS-1))
{
Order[nOrders++] = (ORDERINDEX)seqval;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-21 20:03:56
|
Revision: 374
http://modplug.svn.sourceforge.net/modplug/?rev=374&view=rev
Author: saga-games
Date: 2009-09-21 20:03:46 +0000 (Mon, 21 Sep 2009)
Log Message:
-----------
[New] Color setup: Channel separators can now have custom colors.
[Mod] Color setup: Changed FT2 and IT presets to resemble those two trackers as much as possible.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Draw_pat.cpp
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-09-21 13:05:09 UTC (rev 373)
+++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-09-21 20:03:46 UTC (rev 374)
@@ -124,9 +124,6 @@
BYTE r,g,b;
m_Dib.SetAllColors(0, MAX_MODCOLORS, CMainFrame::rgbCustomColors);
- m_Dib.SetColor(MODSYSCOLOR_LO, GetSysColor(COLOR_BTNSHADOW));
- m_Dib.SetColor(MODSYSCOLOR_MED, GetSysColor(COLOR_BTNFACE));
- m_Dib.SetColor(MODSYSCOLOR_HI, GetSysColor(COLOR_BTNHIGHLIGHT));
r = hilightcolor(GetRValue(CMainFrame::rgbCustomColors[MODCOLOR_BACKHILIGHT]),
GetRValue(CMainFrame::rgbCustomColors[MODCOLOR_BACKNORMAL]));
g = hilightcolor(GetGValue(CMainFrame::rgbCustomColors[MODCOLOR_BACKHILIGHT]),
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-21 13:05:09 UTC (rev 373)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-21 20:03:46 UTC (rev 374)
@@ -364,8 +364,14 @@
{
CString iniFile = theApp.GetConfigFileName();
//CHAR collectedString[INIBUFFERSIZE];
+ MptVersion::VersionNum vIniVersion;
gcsPreviousVersion = GetPrivateProfileCString("Version", "Version", "", iniFile);
+ if(gcsPreviousVersion == "")
+ vIniVersion = MPT_VERSION_NUMERIC;
+ else
+ vIniVersion = MptVersion::ToNum(gcsPreviousVersion);
+
gcsInstallGUID = GetPrivateProfileCString("Version", "InstallGUID", "", iniFile);
gnCheckForUpdates = GetPrivateProfileInt("Version", "CheckForUpdates", 1, iniFile);
gbMdiMaximize = GetPrivateProfileLong("Display", "MDIMaximize", true, iniFile);
@@ -385,10 +391,16 @@
gnMsgBoxVisiblityFlags = GetPrivateProfileDWord("Display", "MsgBoxVisibilityFlags", uint32_max, iniFile);
CHAR s[16];
- for (int ncol=0; ncol<MAX_MODCOLORS; ncol++) {
+ for (int ncol = 0; ncol < MAX_MODCOLORS; ncol++) {
wsprintf(s, "Color%02d", ncol);
rgbCustomColors[ncol] = GetPrivateProfileDWord("Display", s, rgbCustomColors[ncol], iniFile);
}
+ if(rgbCustomColors[MODCOLOR_SEPSHADOW] == rgbCustomColors[MODCOLOR_SEPFACE] == rgbCustomColors[MODCOLOR_SEPHILITE] == 0 && vIniVersion < MAKE_VERSION_NUMERIC(1,17,03,02))
+ {
+ rgbCustomColors[MODCOLOR_SEPSHADOW] = GetSysColor(COLOR_BTNSHADOW);
+ rgbCustomColors[MODCOLOR_SEPFACE] = GetSysColor(COLOR_BTNFACE);
+ rgbCustomColors[MODCOLOR_SEPHILITE] = GetSysColor(COLOR_BTNHIGHLIGHT);
+ }
m_nWaveDevice = GetPrivateProfileLong("Sound Settings", "WaveDevice", (SNDDEV_DSOUND<<8), iniFile);
m_dwSoundSetup = GetPrivateProfileDWord("Sound Settings", "SoundSetup", SOUNDSETUP_SECONDARY, iniFile);
@@ -414,9 +426,9 @@
gnMidiPatternLen = GetPrivateProfileLong("MIDI Settings", "MidiImportPatLen", gnMidiPatternLen, iniFile);
m_dwPatternSetup = GetPrivateProfileDWord("Pattern Editor", "PatternSetup", m_dwPatternSetup, iniFile);
- if(gcsPreviousVersion != "" && MptVersion::ToNum(gcsPreviousVersion) < MAKE_VERSION_NUMERIC(1,17,02,50))
+ if(vIniVersion < MAKE_VERSION_NUMERIC(1,17,02,50))
m_dwPatternSetup |= PATTERN_NOTEFADE;
- if(gcsPreviousVersion != "" && MptVersion::ToNum(gcsPreviousVersion) < MAKE_VERSION_NUMERIC(1,17,03,01))
+ if(vIniVersion < MAKE_VERSION_NUMERIC(1,17,03,01))
m_dwPatternSetup |= PATTERN_RESETCHANNELS;
m_nRowSpacing = GetPrivateProfileDWord("Pattern Editor", "RowSpacing", 16, iniFile);
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2009-09-21 13:05:09 UTC (rev 373)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-09-21 20:03:46 UTC (rev 374)
@@ -157,11 +157,11 @@
MODCOLOR_VUMETER_LO,
MODCOLOR_VUMETER_MED,
MODCOLOR_VUMETER_HI,
+ MODCOLOR_SEPSHADOW,
+ MODCOLOR_SEPFACE,
+ MODCOLOR_SEPHILITE,
MAX_MODCOLORS,
// Internal color codes
- MODSYSCOLOR_LO,
- MODSYSCOLOR_MED,
- MODSYSCOLOR_HI,
MODCOLOR_2NDHIGHLIGHT,
MAX_MODPALETTECOLORS
};
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-21 13:05:09 UTC (rev 373)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-21 20:03:46 UTC (rev 374)
@@ -105,6 +105,7 @@
{"Play Cursor", 0, MODCOLOR_BACKPLAYCURSOR, MODCOLOR_TEXTPLAYCURSOR, 0, "Background:", "Foreground:", NULL},
{"Note Highlight", 0, MODCOLOR_NOTE, MODCOLOR_INSTRUMENT, MODCOLOR_VOLUME, "Note:", "Instrument:", "Volume:"},
{"Effect Highlight",0, MODCOLOR_PANNING, MODCOLOR_PITCH, MODCOLOR_GLOBALS, "Panning Effects:", "Pitch Effects:", "Global Effects:"},
+ {"Channel Separator",0, MODCOLOR_SEPSHADOW, MODCOLOR_SEPFACE, MODCOLOR_SEPHILITE, "Shadow:", "Face:", "Highlight:"},
{"Sample Editor", 1, MODCOLOR_SAMPLE, 0, 0, "Sample Data:", NULL, NULL},
{"Instrument Editor",2, MODCOLOR_ENVELOPES, 0, 0, "Envelopes:", NULL, NULL},
{"VU-Meters", 0, MODCOLOR_VUMETER_HI, MODCOLOR_VUMETER_MED, MODCOLOR_VUMETER_LO, "Hi:", "Med:", "Lo:"}
@@ -483,6 +484,9 @@
CustomColors[MODCOLOR_PANNING] = RGB(0x00, 0x80, 0x80);
CustomColors[MODCOLOR_PITCH] = RGB(0x80, 0x80, 0x00);
CustomColors[MODCOLOR_GLOBALS] = RGB(0x80, 0x00, 0x00);
+ CustomColors[MODCOLOR_SEPSHADOW] = GetSysColor(COLOR_BTNSHADOW);
+ CustomColors[MODCOLOR_SEPFACE] = GetSysColor(COLOR_BTNFACE);
+ CustomColors[MODCOLOR_SEPHILITE] = GetSysColor(COLOR_BTNHIGHLIGHT);
OnPreviewChanged();
}
@@ -491,20 +495,25 @@
//--------------------------------
{
CustomColors[MODCOLOR_BACKNORMAL] = RGB(0x00, 0x00, 0x00);
- CustomColors[MODCOLOR_TEXTNORMAL] = RGB(0xE0, 0xE0, 0x40);
- CustomColors[MODCOLOR_BACKCURROW] = RGB(0x70, 0x70, 0x70);
- CustomColors[MODCOLOR_TEXTCURROW] = RGB(0xF0, 0xF0, 0x50);
- CustomColors[MODCOLOR_BACKSELECTED] = RGB(0x40, 0x40, 0xA0);
+ CustomColors[MODCOLOR_TEXTNORMAL] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_BACKCURROW] = RGB(0x49, 0x75, 0x82);
+ CustomColors[MODCOLOR_TEXTCURROW] = RGB(0xFF, 0xFF, 0x5F);
+ CustomColors[MODCOLOR_BACKSELECTED] = RGB(0x28, 0x28, 0x28);
CustomColors[MODCOLOR_TEXTSELECTED] = RGB(0xFF, 0xFF, 0xFF);
- CustomColors[MODCOLOR_BACKPLAYCURSOR] = RGB(0x50, 0x50, 0x70);
- CustomColors[MODCOLOR_TEXTPLAYCURSOR] = RGB(0xE0, 0xE0, 0x40);
- CustomColors[MODCOLOR_BACKHILIGHT] = RGB(0x40, 0x40, 0x80);
- CustomColors[MODCOLOR_NOTE] = RGB(0xE0, 0xE0, 0x40);
- CustomColors[MODCOLOR_INSTRUMENT] = RGB(0xFF, 0xFF, 0x00);
- CustomColors[MODCOLOR_VOLUME] = RGB(0x00, 0xFF, 0x00);
- CustomColors[MODCOLOR_PANNING] = RGB(0x00, 0xFF, 0xFF);
- CustomColors[MODCOLOR_PITCH] = RGB(0xFF, 0xFF, 0x00);
- CustomColors[MODCOLOR_GLOBALS] = RGB(0xFF, 0x40, 0x40);
+ CustomColors[MODCOLOR_BACKPLAYCURSOR] = RGB(0x49, 0x75, 0x82);
+ CustomColors[MODCOLOR_TEXTPLAYCURSOR] = RGB(0xFF, 0xFF, 0xFF);
+ CustomColors[MODCOLOR_BACKHILIGHT] = RGB(0x27, 0x41, 0x47);
+ CustomColors[MODCOLOR_NOTE] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_INSTRUMENT] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_VOLUME] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_PANNING] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_PITCH] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_GLOBALS] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_SAMPLE] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_ENVELOPES] = RGB(0xFF, 0xFF, 0x82);
+ CustomColors[MODCOLOR_SEPSHADOW] = RGB(0x18, 0x28, 0x2C);
+ CustomColors[MODCOLOR_SEPFACE] = RGB(0x49, 0x75, 0x82);
+ CustomColors[MODCOLOR_SEPHILITE] = RGB(0x8A, 0xDB, 0xF3);
OnPreviewChanged();
}
@@ -513,20 +522,25 @@
//-------------------------------
{
CustomColors[MODCOLOR_BACKNORMAL] = RGB(0x00, 0x00, 0x00);
- CustomColors[MODCOLOR_TEXTNORMAL] = RGB(0x00, 0xE0, 0x00);
- CustomColors[MODCOLOR_BACKCURROW] = RGB(0x70, 0x70, 0x70);
- CustomColors[MODCOLOR_TEXTCURROW] = RGB(0x00, 0xE0, 0x00);
- CustomColors[MODCOLOR_BACKSELECTED] = RGB(0xE0, 0xE0, 0xE0);
- CustomColors[MODCOLOR_TEXTSELECTED] = RGB(0x00, 0x00, 0x00);
- CustomColors[MODCOLOR_BACKPLAYCURSOR] = RGB(0x80, 0x80, 0x00);
- CustomColors[MODCOLOR_TEXTPLAYCURSOR] = RGB(0x00, 0xE0, 0x00);
- CustomColors[MODCOLOR_BACKHILIGHT] = RGB(0x40, 0x68, 0x40);
- CustomColors[MODCOLOR_NOTE] = RGB(0x00, 0xFF, 0x00);
- CustomColors[MODCOLOR_INSTRUMENT] = RGB(0xFF, 0xFF, 0x00);
- CustomColors[MODCOLOR_VOLUME] = RGB(0x00, 0xFF, 0x00);
- CustomColors[MODCOLOR_PANNING] = RGB(0x00, 0xFF, 0xFF);
- CustomColors[MODCOLOR_PITCH] = RGB(0xFF, 0xFF, 0x00);
- CustomColors[MODCOLOR_GLOBALS] = RGB(0xFF, 0x40, 0x40);
+ CustomColors[MODCOLOR_TEXTNORMAL] = RGB(0x45, 0x9A, 0x49);
+ CustomColors[MODCOLOR_BACKCURROW] = RGB(0x10, 0x35, 0x00);
+ CustomColors[MODCOLOR_TEXTCURROW] = RGB(0xEB, 0xEB, 0xCB);
+ CustomColors[MODCOLOR_BACKSELECTED] = RGB(0x20, 0x55, 0x00);
+ CustomColors[MODCOLOR_TEXTSELECTED] = RGB(0xEB, 0xEB, 0xCB);
+ CustomColors[MODCOLOR_BACKPLAYCURSOR] = RGB(0x59, 0x41, 0x3C);
+ CustomColors[MODCOLOR_TEXTPLAYCURSOR] = RGB(0x45, 0x9A, 0x49);
+ CustomColors[MODCOLOR_BACKHILIGHT] = RGB(0x59, 0x41, 0x3C);
+ CustomColors[MODCOLOR_NOTE] = RGB(0x45, 0x9A, 0x49);
+ CustomColors[MODCOLOR_INSTRUMENT] = RGB(0x38, 0x9E, 0x75);
+ CustomColors[MODCOLOR_VOLUME] = RGB(0xA2, 0xA2, 0xA2);
+ CustomColors[MODCOLOR_PANNING] = RGB(0x18, 0x75, 0x2C);
+ CustomColors[MODCOLOR_PITCH] = RGB(0x45, 0x9A, 0x49);
+ CustomColors[MODCOLOR_GLOBALS] = RGB(0x45, 0x9A, 0x49);
+ CustomColors[MODCOLOR_SAMPLE] = RGB(0x8E, 0x14, 0x55);
+ CustomColors[MODCOLOR_ENVELOPES] = RGB(0xA2, 0xA2, 0xA2);
+ CustomColors[MODCOLOR_SEPSHADOW] = RGB(0xB6, 0x96, 0x79);
+ CustomColors[MODCOLOR_SEPFACE] = RGB(0xB6, 0x96, 0x79);
+ CustomColors[MODCOLOR_SEPHILITE] = RGB(0xB6, 0x96, 0x79);
OnPreviewChanged();
}
@@ -540,7 +554,6 @@
CustomColors[MODCOLOR_TEXTCURROW] = 0x00000000;
CustomColors[MODCOLOR_BACKSELECTED] = 0x00000000;
CustomColors[MODCOLOR_TEXTSELECTED] = 0x00ccd7dd;
- CustomColors[MODCOLOR_SAMPLE] = 0x0000ff00;
CustomColors[MODCOLOR_BACKPLAYCURSOR] = 0x007a99a9;
CustomColors[MODCOLOR_TEXTPLAYCURSOR] = 0x00000000;
CustomColors[MODCOLOR_BACKHILIGHT] = 0x00b5c5ce;
@@ -550,7 +563,11 @@
CustomColors[MODCOLOR_PANNING] = 0x00686800;
CustomColors[MODCOLOR_PITCH] = 0x00006262;
CustomColors[MODCOLOR_GLOBALS] = 0x00000066;
+ CustomColors[MODCOLOR_SAMPLE] = 0x0000ff00;
CustomColors[MODCOLOR_ENVELOPES] = 0x000000ff;
+ CustomColors[MODCOLOR_SEPSHADOW] = RGB(0x80, 0x80, 0x80);
+ CustomColors[MODCOLOR_SEPFACE] = RGB(0xD4, 0xD0, 0xC8);
+ CustomColors[MODCOLOR_SEPHILITE] = RGB(0xFF, 0xFF, 0xFF);
OnPreviewChanged();
}
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-21 13:05:09 UTC (rev 373)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-21 20:03:46 UTC (rev 374)
@@ -2255,9 +2255,9 @@
m_Dib.bmiHeader.biClrUsed = 0;
m_Dib.bmiHeader.biClrImportant = 256; // MAX_MODPALETTECOLORS;
m_n4BitPalette[0] = (BYTE)m_nTextColor;
- m_n4BitPalette[4] = MODSYSCOLOR_LO;
- m_n4BitPalette[12] = MODSYSCOLOR_MED;
- m_n4BitPalette[14] = MODSYSCOLOR_HI;
+ m_n4BitPalette[4] = MODCOLOR_SEPSHADOW;
+ m_n4BitPalette[12] = MODCOLOR_SEPFACE;
+ m_n4BitPalette[14] = MODCOLOR_SEPHILITE;
m_n4BitPalette[15] = (BYTE)m_nBkColor;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-21 13:05:20
|
Revision: 373
http://modplug.svn.sourceforge.net/modplug/?rev=373&view=rev
Author: saga-games
Date: 2009-09-21 13:05:09 +0000 (Mon, 21 Sep 2009)
Log Message:
-----------
[Imp] Tuning dialog: Using the default tuning path as default path for Import/Export dialog
[Imp] IT Loader: Removed unnecessary / wrong pre-amp limits
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Mptrack.h
trunk/OpenMPT/mptrack/TuningDialog.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
Modified: trunk/OpenMPT/mptrack/Mptrack.h
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.h 2009-09-20 13:44:24 UTC (rev 372)
+++ trunk/OpenMPT/mptrack/Mptrack.h 2009-09-21 13:05:09 UTC (rev 373)
@@ -187,6 +187,7 @@
BOOL IsDebug() const { return m_bDebugMode; }
LPCSTR GetConfigFileName() const { return m_szConfigFileName; }
LPCSTR GetPluginCacheFileName() const { return m_szPluginCacheFileName; }
+ LPCSTR GetTuningsPath() const { return m_szTuningsDirectory; }
LPCSTR GetConfigPath() const { return m_szConfigDirectory; }
void SetupPaths();
Modified: trunk/OpenMPT/mptrack/TuningDialog.cpp
===================================================================
--- trunk/OpenMPT/mptrack/TuningDialog.cpp 2009-09-20 13:44:24 UTC (rev 372)
+++ trunk/OpenMPT/mptrack/TuningDialog.cpp 2009-09-21 13:05:09 UTC (rev 373)
@@ -629,6 +629,7 @@
NULL,
OFN_HIDEREADONLY| OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN,
filter.c_str(), this);
+ dlg.m_ofn.lpstrInitialDir = theApp.GetTuningsPath();
bool failure = true;
@@ -668,6 +669,7 @@
OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
filter.c_str(),
this);
+ dlg.m_ofn.lpstrInitialDir = theApp.GetTuningsPath();
if (dlg.DoModal() != IDOK) return;
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-20 13:44:24 UTC (rev 372)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-21 13:05:09 UTC (rev 373)
@@ -1871,12 +1871,10 @@
if (m_dwSongFlags & SONG_ITCOMPATMODE) header.flags |= 0x20;
if (m_dwSongFlags & SONG_EXFILTERRANGE) header.flags |= 0x1000;
header.globalvol = m_nDefaultGlobalVolume >> 1;
- header.mv = m_nSamplePreAmp;
- if (header.mv < 0x20) header.mv = 0x20;
- if (header.mv > 0x7F) header.mv = 0x7F;
+ header.mv = CLAMP(m_nSamplePreAmp, 0, 128);
header.speed = m_nDefaultSpeed;
- header.tempo = min(m_nDefaultTempo,255); //Limit this one to 255, we save the real one as an extension below.
- header.sep = 128;
+ header.tempo = min(m_nDefaultTempo, 255); //Limit this one to 255, we save the real one as an extension below.
+ header.sep = 128; // pan separation
dwHdrPos = sizeof(header) + header.ordnum;
// Channel Pan and Volume
memset(header.chnpan, 0xFF, 64);
@@ -2521,11 +2519,9 @@
if (m_dwSongFlags & SONG_EXFILTERRANGE) header.flags |= 0x1000;
header.globalvol = m_nDefaultGlobalVolume >> 1;
header.mv = CLAMP(m_nSamplePreAmp, 0, 128);
- if (header.mv < 0x20) header.mv = 0x20;
- if (header.mv > 0x7F) header.mv = 0x7F;
header.speed = m_nDefaultSpeed;
- header.tempo = min(m_nDefaultTempo,255); //Limit this one to 255, we save the real one as an extension below.
- header.sep = 128;
+ header.tempo = min(m_nDefaultTempo, 255); //Limit this one to 255, we save the real one as an extension below.
+ header.sep = 128; // pan separation
dwHdrPos = sizeof(header) + header.ordnum;
// Channel Pan and Volume
memset(header.chnpan, 0xFF, 64);
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-20 13:44:24 UTC (rev 372)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-21 13:05:09 UTC (rev 373)
@@ -2896,7 +2896,7 @@
}
// Load local tunings.
- s_pTuningsSharedLocal->SetSavefilePath(std::string(std::string(theApp.GetConfigPath()) + "tunings\\local_tunings" + CTuningCollection::s_FileExtension.c_str()));
+ s_pTuningsSharedLocal->SetSavefilePath(std::string(std::string(theApp.GetTuningsPath()) + "local_tunings" + CTuningCollection::s_FileExtension.c_str()));
s_pTuningsSharedLocal->Deserialize();
// Enabling adding/removing of tunings for standard collection
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-20 13:44:31
|
Revision: 372
http://modplug.svn.sourceforge.net/modplug/?rev=372&view=rev
Author: saga-games
Date: 2009-09-20 13:44:24 +0000 (Sun, 20 Sep 2009)
Log Message:
-----------
[Mod] Store configuration and tuning files in %APPDATA% if possible. Can be disabled by adding UseAppDataDirectory=0 to [Paths] in mptrack.ini.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/AutoSaver.cpp
trunk/OpenMPT/mptrack/InputHandler.cpp
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/mptrack/Mptrack.h
trunk/OpenMPT/soundlib/Sndfile.cpp
Modified: trunk/OpenMPT/mptrack/AutoSaver.cpp
===================================================================
--- trunk/OpenMPT/mptrack/AutoSaver.cpp 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/AutoSaver.cpp 2009-09-20 13:44:24 UTC (rev 372)
@@ -191,8 +191,8 @@
if (m_bUseOriginalPath) {
if (pModDoc->m_bHasValidPath) { // Check that the file has a user-chosen path
name = pModDoc->GetPathName();
- } else { // if it doesnt, put it in executable dir
- name = CMainFrame::m_csExecutableDirectoryPath + pModDoc->GetTitle();
+ } else { // if it doesnt, put it in settings dir
+ name = theApp.GetConfigPath() + pModDoc->GetTitle();
}
} else {
@@ -271,7 +271,7 @@
CString fullPath = pModDoc->GetPathName();
path = fullPath.Left(fullPath.GetLength()-pModDoc->GetTitle().GetLength()); //remove file name if necessary
} else {
- path = CMainFrame::m_csExecutableDirectoryPath;
+ path = theApp.GetConfigPath();
}
} else {
path = m_csPath;
Modified: trunk/OpenMPT/mptrack/InputHandler.cpp
===================================================================
--- trunk/OpenMPT/mptrack/InputHandler.cpp 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/InputHandler.cpp 2009-09-20 13:44:24 UTC (rev 372)
@@ -23,7 +23,7 @@
activeCommandSet = new CCommandSet();
CCommandSet::s_bShowErrorOnUnknownKeybinding = (CMainFrame::GetMainFrame()->GetPrivateProfileLong("Misc", "ShowErrorOnUnknownKeybinding", 1, theApp.GetConfigFileName()) != 0);
- CString sDefaultPath = CMainFrame::m_csExecutableDirectoryPath + TEXT("Keybindings.mkb");
+ CString sDefaultPath = CString(theApp.GetConfigPath()) + TEXT("Keybindings.mkb");
if (sDefaultPath.GetLength() > MAX_PATH - 1)
sDefaultPath = "";
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-20 13:44:24 UTC (rev 372)
@@ -267,8 +267,6 @@
CAutoSaver *CMainFrame::m_pAutoSaver = NULL; //rewbs.autosave
CPerformanceCounter *CMainFrame::m_pPerfCounter = NULL;
-CString CMainFrame::m_csExecutableDirectoryPath = "";
-
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
@@ -285,17 +283,6 @@
CMainFrame::CMainFrame()
//----------------------
{
- {
- char path[_MAX_PATH];
- char exedrive[_MAX_DRIVE];
- char exedir[_MAX_DIR];
- GetModuleFileName(NULL, path, MAX_PATH);
- _splitpath(path, exedrive, exedir, NULL, NULL);
- memset(path, 0, sizeof(path));
- _makepath(path, exedrive, exedir, NULL, NULL);
- m_csExecutableDirectoryPath = path; //path should end with \
- }
-
m_bModTreeHasFocus = false; //rewbs.customKeys
m_pNoteMapHasFocus = NULL; //rewbs.customKeys
m_bOptionsLocked = false; //rewbs.customKeys
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-09-20 13:44:24 UTC (rev 372)
@@ -383,7 +383,6 @@
CString m_csRegExt;
CString m_csRegSettings;
CString m_csRegWindow;
- static CString m_csExecutableDirectoryPath; //To contain path of executable directory
// Globals
static UINT m_nLastOptionsPage, m_nFilterIndex;
static BOOL gbMdiMaximize;
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-20 13:44:24 UTC (rev 372)
@@ -562,7 +562,7 @@
"OpenMPT Color Schemes|*.mptcolor|"
"All Files (*.*)|*.*||",
this);
- dlg.m_ofn.lpstrInitialDir = CMainFrame::m_csExecutableDirectoryPath;
+ dlg.m_ofn.lpstrInitialDir = theApp.GetConfigPath();
if (dlg.DoModal() != IDOK) return;
TCHAR sFilename[MAX_PATH];
@@ -584,7 +584,7 @@
OFN_HIDEREADONLY| OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN,
"OpenMPT Color Schemes|*.mptcolor|",
this);
- dlg.m_ofn.lpstrInitialDir = CMainFrame::m_csExecutableDirectoryPath;
+ dlg.m_ofn.lpstrInitialDir = theApp.GetConfigPath();
if (dlg.DoModal() != IDOK) return;
TCHAR sFilename[MAX_PATH];
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-20 13:44:24 UTC (rev 372)
@@ -407,11 +407,11 @@
wsprintf(s, "Midi%d", iMidi);
else
wsprintf(s, "Perc%d", iMidi & 0x7F);
- if ((glpMidiLibrary->MidiMap[iMidi][1] == ':') && (lpszConfigFile[1] == ':')
+ /*if ((glpMidiLibrary->MidiMap[iMidi][1] == ':') && (lpszConfigFile[1] == ':')
&& ((glpMidiLibrary->MidiMap[iMidi][0]|0x20) == (lpszConfigFile[0]|0x20)))
{
strcpy(szFileName, glpMidiLibrary->MidiMap[iMidi]+2);
- } else
+ } else*/
{
strcpy(szFileName, glpMidiLibrary->MidiMap[iMidi]);
}
@@ -669,6 +669,129 @@
exit(-1);
}
+void CTrackApp::MoveConfigFile(TCHAR sFileName[_MAX_PATH], TCHAR sSubDir[_MAX_PATH], TCHAR sNewFileName[_MAX_PATH])
+//-----------------------------------------------------------------------------------------------------------------
+{
+ // copy a config file from the exe directory to the new config dirs
+ TCHAR sOldPath[_MAX_PATH], sNewPath[_MAX_PATH];
+ strcpy(sOldPath, m_szExePath);
+ if(sSubDir[0])
+ strcat(sOldPath, sSubDir);
+ strcat(sOldPath, sFileName);
+
+ strcpy(sNewPath, m_szConfigDirectory);
+ if(sSubDir[0])
+ strcat(sNewPath, sSubDir);
+ if(sNewFileName[0])
+ strcat(sNewPath, sNewFileName);
+ else
+ strcat(sNewPath, sFileName);
+
+ if(PathFileExists(sNewPath) == 0 && PathFileExists(sOldPath) != 0)
+ {
+ MoveFile(sOldPath, sNewPath);
+ }
+}
+
+
+void CTrackApp::SetupPaths()
+//--------------------------
+{
+ if(GetModuleFileName(NULL, m_szExePath, _MAX_PATH))
+ {
+ TCHAR szDrive[_MAX_DRIVE] = "", szDir[_MAX_PATH] = "";
+ _splitpath(m_szExePath, szDrive, szDir, NULL, NULL);
+ strcpy(m_szExePath, szDrive);
+ strcat(m_szExePath, szDir);
+ }
+
+ m_szConfigDirectory[0] = 0;
+ // Try to find a nice directory where we should store our settings (default: %APPDATA%)
+ bool bIsAppDir = false;
+ if(!SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, m_szConfigDirectory)))
+ {
+ if(!SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, m_szConfigDirectory)))
+ {
+ strcpy(m_szConfigDirectory, m_szExePath);
+ bIsAppDir = true;
+ }
+ }
+
+ // Check if the user prefers to use the app's directory
+ strcpy(m_szConfigFileName, m_szExePath); // config file
+ strcat(m_szConfigFileName, "mptrack.ini");
+ if(GetPrivateProfileInt("Paths", "UseAppDataDirectory", 1, m_szConfigFileName) == 0)
+ {
+ strcpy(m_szConfigDirectory, m_szExePath);
+ bIsAppDir = true;
+ }
+
+ if(!bIsAppDir)
+ {
+ // Store our app settings in %APPDATA% or "My Files"
+ strcat(m_szConfigDirectory, "\\OpenMPT\\");
+
+ // Path doesn't exist yet, so it has to be created
+ if(PathIsDirectory(m_szConfigDirectory) == 0)
+ {
+ CreateDirectory(m_szConfigDirectory, 0);
+ }
+
+ // Move files if necessary.
+ MoveConfigFile("mptrack.ini");
+ MoveConfigFile("plugin.cache");
+ MoveConfigFile("mpt_intl.ini");
+ MoveConfigFile("default.mkb", "", "Keybindings.mkb");
+ }
+
+ // Create tunings dir
+ strcpy(m_szTuningsDirectory, m_szConfigDirectory);
+ strcat(m_szTuningsDirectory, "tunings\\");
+
+ if(PathIsDirectory(m_szTuningsDirectory) == 0)
+ {
+ CreateDirectory(m_szTuningsDirectory, 0);
+ }
+
+ if(!bIsAppDir)
+ {
+ // Import old tunings
+ TCHAR sOldTunings[_MAX_PATH];
+ strcpy(sOldTunings, m_szExePath);
+ strcat(sOldTunings, "tunings\\");
+
+ if(PathIsDirectory(sOldTunings) != 0)
+ {
+ TCHAR sSearchPattern[_MAX_PATH];
+ strcpy(sSearchPattern, sOldTunings);
+ strcat(sSearchPattern, "*.*");
+ WIN32_FIND_DATA FindFileData;
+ HANDLE hFind;
+ hFind = FindFirstFile(sSearchPattern, &FindFileData);
+ if(hFind != INVALID_HANDLE_VALUE)
+ {
+ do
+ {
+ MoveConfigFile(FindFileData.cFileName, "tunings\\");
+ } while(FindNextFile(hFind, &FindFileData) != 0);
+ }
+ FindClose(hFind);
+ RemoveDirectory(sOldTunings);
+ }
+ }
+
+ // Set up default file locations
+ strcpy(m_szConfigFileName, m_szConfigDirectory); // config file
+ strcat(m_szConfigFileName, "mptrack.ini");
+
+ strcpy(m_szStringsFileName, m_szConfigDirectory); // I18N file
+ strcat(m_szStringsFileName, "mpt_intl.ini");
+
+ strcpy(m_szPluginCacheFileName, m_szConfigDirectory); // plugin cache
+ strcat(m_szPluginCacheFileName, "plugin.cache");
+
+}
+
BOOL CTrackApp::InitInstance()
//----------------------------
{
@@ -711,35 +834,9 @@
// Disabled by rewbs for smoothVST. Might cause minor perf issues due to increased cache misses?
#endif
- m_szConfigFileName[0] = 0;
- m_szStringsFileName[0] = 0;
+ // Set up paths to store configuration in
+ SetupPaths();
- if (GetModuleFileName(NULL, m_szConfigFileName, sizeof(m_szConfigFileName)))
- {
- CHAR szDrive[_MAX_DRIVE]="", szDir[_MAX_PATH]="";
- _splitpath(m_szConfigFileName, szDrive, szDir, NULL, NULL);
- m_szConfigFileName[0] = 0;
- lstrcpyn(m_szConfigFileName, szDrive, sizeof(m_szConfigFileName));
- strncat(m_szConfigFileName, szDir, sizeof(m_szConfigFileName));
- m_szConfigFileName[sizeof(m_szConfigFileName)-1] = 0;
- strncat(m_szConfigFileName, "mptrack.ini", sizeof(m_szConfigFileName));
- m_szConfigFileName[sizeof(m_szConfigFileName)-1] = 0;
-
- m_szPluginCacheFileName[0] = 0;
- lstrcpyn(m_szPluginCacheFileName, szDrive, sizeof(m_szPluginCacheFileName));
- strncat(m_szPluginCacheFileName, szDir, sizeof(m_szPluginCacheFileName));
- m_szPluginCacheFileName[sizeof(m_szPluginCacheFileName)-1] = 0;
- strncat(m_szPluginCacheFileName, "plugin.cache", sizeof(m_szPluginCacheFileName));
- m_szPluginCacheFileName[sizeof(m_szPluginCacheFileName)-1] = 0;
-
- m_szStringsFileName[0] = 0;
- lstrcpyn(m_szStringsFileName, szDrive, sizeof(m_szStringsFileName));
- strncat(m_szStringsFileName, szDir, sizeof(m_szStringsFileName));
- m_szStringsFileName[sizeof(m_szStringsFileName)-1] = 0;
- strncat(m_szStringsFileName, "mpt_intl.ini", sizeof(m_szStringsFileName));
- m_szStringsFileName[sizeof(m_szStringsFileName)-1] = 0;
- }
-
//Force use of custom ini file rather than windowsDir\executableName.ini
if (m_pszProfileName) {
free((void *)m_pszProfileName);
Modified: trunk/OpenMPT/mptrack/Mptrack.h
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.h 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/mptrack/Mptrack.h 2009-09-20 13:44:24 UTC (rev 372)
@@ -140,9 +140,12 @@
HANDLE m_hAlternateResourceHandle;
// Default macro configuration
MODMIDICFG m_MidiCfg;
- CHAR m_szConfigFileName[_MAX_PATH];
- CHAR m_szPluginCacheFileName[_MAX_PATH];
- CHAR m_szStringsFileName[_MAX_PATH];
+ TCHAR m_szExePath[_MAX_PATH];
+ TCHAR m_szConfigDirectory[_MAX_PATH];
+ TCHAR m_szTuningsDirectory[_MAX_PATH];
+ TCHAR m_szConfigFileName[_MAX_PATH];
+ TCHAR m_szPluginCacheFileName[_MAX_PATH];
+ TCHAR m_szStringsFileName[_MAX_PATH];
#ifdef UPDATECHECKENABLED
// Internet request context
@@ -184,6 +187,8 @@
BOOL IsDebug() const { return m_bDebugMode; }
LPCSTR GetConfigFileName() const { return m_szConfigFileName; }
LPCSTR GetPluginCacheFileName() const { return m_szPluginCacheFileName; }
+ LPCSTR GetConfigPath() const { return m_szConfigDirectory; }
+ void SetupPaths();
// Splash Screen
protected:
@@ -261,6 +266,8 @@
private:
static void LoadRegistryDLS();
+
+ void MoveConfigFile(TCHAR sFileName[_MAX_PATH], TCHAR sSubDir[_MAX_PATH] = "", TCHAR sNewFileName[_MAX_PATH] = "");
};
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-20 13:09:10 UTC (rev 371)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-20 13:44:24 UTC (rev 372)
@@ -2896,7 +2896,7 @@
}
// Load local tunings.
- s_pTuningsSharedLocal->SetSavefilePath(std::string(CMainFrame::m_csExecutableDirectoryPath + "tunings\\local_tunings" + CTuningCollection::s_FileExtension.c_str()));
+ s_pTuningsSharedLocal->SetSavefilePath(std::string(std::string(theApp.GetConfigPath()) + "tunings\\local_tunings" + CTuningCollection::s_FileExtension.c_str()));
s_pTuningsSharedLocal->Deserialize();
// Enabling adding/removing of tunings for standard collection
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-20 13:09:20
|
Revision: 371
http://modplug.svn.sourceforge.net/modplug/?rev=371&view=rev
Author: saga-games
Date: 2009-09-20 13:09:10 +0000 (Sun, 20 Sep 2009)
Log Message:
-----------
[Fix] Sequence Editor: Clicking on an order moved it when the mouse button was released after skipping to another order (e.g. during playback) - Bug was introduced with multi-order dragging.
[Fix] S3M Loader: Limit min sample preamp value to 0x10
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/soundlib/Load_s3m.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-20 13:04:44 UTC (rev 370)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-20 13:09:10 UTC (rev 371)
@@ -659,6 +659,7 @@
SetCurSel(nOrder, true, ih->ShiftPressed());
}
m_bDragging = IsOrderInMargins(m_nScrollPos, oldXScroll) ? false : true;
+
if(m_bDragging == true)
{
m_nDragOrder = GetCurSel(true).nOrdLo;
@@ -695,8 +696,8 @@
// drop before or after the selection
bool bMoveBack = !(m_nDragOrder < (UINT)m_nDropPos);
// don't do anything if drop position is inside the selection
- if(m_nDropPos >= selection.nOrdLo && m_nDropPos <= selection.nOrdHi) return;
- // drag or order or multiple orders?
+ if(m_nDropPos >= selection.nOrdLo && m_nDropPos <= selection.nOrdHi || m_nDragOrder == m_nDropPos) return;
+ // drag one order or multiple orders?
bool bMultiSelection = (selection.nOrdLo != selection.nOrdHi);
for(int i = 0; i <= nMoveCount; i++)
Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-09-20 13:04:44 UTC (rev 370)
+++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-09-20 13:09:10 UTC (rev 371)
@@ -276,7 +276,7 @@
m_nDefaultGlobalVolume = psfh.globalvol << 2;
if(!m_nDefaultGlobalVolume && psfh.cwtv < 0x1320) m_nDefaultGlobalVolume = 256; // not very reliable, but it fixes a few tunes
if(m_nDefaultGlobalVolume > 256) m_nDefaultGlobalVolume = 256;
- m_nSamplePreAmp = psfh.mastervol & 0x7F; // Bit 8 = Stereo (we always use stereo)
+ m_nSamplePreAmp = CLAMP(psfh.mastervol & 0x7F, 0x10, 0x7F); // Bit 8 = Stereo (we always use stereo)
// Channels
m_nChannels = 4;
for (UINT ich=0; ich<32; ich++)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <rel...@us...> - 2009-09-20 13:04:51
|
Revision: 370
http://modplug.svn.sourceforge.net/modplug/?rev=370&view=rev
Author: relabsoluness
Date: 2009-09-20 13:04:44 +0000 (Sun, 20 Sep 2009)
Log Message:
-----------
[Fix] Pattern tab: Sequence name control wasn't updated properly.
[Mod] Version: Changed version number.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/version.h
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-09-18 18:48:59 UTC (rev 369)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-09-20 13:04:44 UTC (rev 370)
@@ -190,6 +190,7 @@
SetDlgItemInt(IDC_EDIT_SPACING, CMainFrame::gnPatternSpacing);
SetDlgItemInt(IDC_EDIT_ORDERLIST_MARGINS, m_OrderList.GetMargins());
CheckDlgButton(IDC_PATTERN_FOLLOWSONG, !(CMainFrame::m_dwPatternSetup & PATTERN_FOLLOWSONGOFF)); //rewbs.noFollow - set to unchecked
+ SetDlgItemText(IDC_EDIT_SEQUENCE_NAME, m_pSndFile->Order.m_sName);
m_OrderList.SetFocus();
UpdateView(HINT_MODTYPE|HINT_PATNAMES, NULL);
Modified: trunk/OpenMPT/mptrack/version.h
===================================================================
--- trunk/OpenMPT/mptrack/version.h 2009-09-18 18:48:59 UTC (rev 369)
+++ trunk/OpenMPT/mptrack/version.h 2009-09-20 13:04:44 UTC (rev 370)
@@ -15,7 +15,7 @@
#define VER_MAJORMAJOR 1
#define VER_MAJOR 17
#define VER_MINOR 03
-#define VER_MINORMINOR 01
+#define VER_MINORMINOR 02
//Creates version number from version parts that appears in version string.
//For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-18 18:49:14
|
Revision: 369
http://modplug.svn.sourceforge.net/modplug/?rev=369&view=rev
Author: saga-games
Date: 2009-09-18 18:48:59 +0000 (Fri, 18 Sep 2009)
Log Message:
-----------
[Fix] ITI Loader/Saver: Forgot to change vibrato sweep settings here in the last commit
[Ref] Some more refactoring
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/soundlib/Sampleio.cpp
trunk/OpenMPT/soundlib/Sndfile.h
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-17 16:11:47 UTC (rev 368)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-18 18:48:59 UTC (rev 369)
@@ -1017,13 +1017,13 @@
}
-BOOL CModDoc::MuteChannel(UINT nChn, BOOL doMute)
+bool CModDoc::MuteChannel(CHANNELINDEX nChn, bool doMute)
//----------------------------------------------
{
DWORD muteType = (CMainFrame::m_dwPatternSetup&PATTERN_SYNCMUTE)? CHN_SYNCMUTE:CHN_MUTE;
if (nChn >= m_SndFile.m_nChannels) {
- return FALSE;
+ return false;
}
//Mark channel as muted in channel settings
@@ -1067,43 +1067,43 @@
CMainFrame::GetMainFrame()->ThreadSafeSetModified(this);
}
- return TRUE;
+ return true;
}
// -> CODE#0012
// -> DESC="midi keyboard split"
-BOOL CModDoc::IsChannelSolo(UINT nChn) const
-//------------------------------------------
+bool CModDoc::IsChannelSolo(CHANNELINDEX nChn) const
+//--------------------------------------------------
{
- if (nChn >= m_SndFile.m_nChannels) return TRUE;
- return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_SOLO) ? TRUE : FALSE;
+ if (nChn >= m_SndFile.m_nChannels) return true;
+ return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_SOLO) ? true : false;
}
-BOOL CModDoc::SoloChannel(UINT nChn, BOOL bSolo)
-//---------------------------------------------
+bool CModDoc::SoloChannel(CHANNELINDEX nChn, bool bSolo)
+//------------------------------------------------------
{
- if (nChn >= m_SndFile.m_nChannels) return FALSE;
+ if (nChn >= m_SndFile.m_nChannels) return false;
if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified();
if (bSolo) m_SndFile.ChnSettings[nChn].dwFlags |= CHN_SOLO;
else m_SndFile.ChnSettings[nChn].dwFlags &= ~CHN_SOLO;
- return TRUE;
+ return true;
}
// -! NEW_FEATURE#0012
// -> CODE#0015
// -> DESC="channels management dlg"
-BOOL CModDoc::IsChannelNoFx(UINT nChn) const
+bool CModDoc::IsChannelNoFx(CHANNELINDEX nChn) const
//------------------------------------------
{
- if (nChn >= m_SndFile.m_nChannels) return TRUE;
- return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_NOFX) ? TRUE : FALSE;
+ if (nChn >= m_SndFile.m_nChannels) return true;
+ return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_NOFX) ? true : false;
}
-BOOL CModDoc::NoFxChannel(UINT nChn, BOOL bNoFx, BOOL updateMix)
-//--------------------------------------------------------------
+bool CModDoc::NoFxChannel(CHANNELINDEX nChn, bool bNoFx, bool updateMix)
+//----------------------------------------------------------------------
{
- if (nChn >= m_SndFile.m_nChannels) return FALSE;
+ if (nChn >= m_SndFile.m_nChannels) return false;
if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified();
if (bNoFx){
m_SndFile.ChnSettings[nChn].dwFlags |= CHN_NOFX;
@@ -1113,33 +1113,33 @@
m_SndFile.ChnSettings[nChn].dwFlags &= ~CHN_NOFX;
if(updateMix) m_SndFile.Chn[nChn].dwFlags &= ~CHN_NOFX;
}
- return TRUE;
+ return true;
}
-BOOL CModDoc::IsChannelRecord1(UINT channel)
-//------------------------------------------
+bool CModDoc::IsChannelRecord1(CHANNELINDEX channel)
+//--------------------------------------------------
{
UINT m = 1 << (channel&7);
- return (MultiRecordMask[channel>>3] & m) ? TRUE : FALSE;
+ return (MultiRecordMask[channel>>3] & m) ? true : false;
}
-BOOL CModDoc::IsChannelRecord2(UINT channel)
-//------------------------------------------
+bool CModDoc::IsChannelRecord2(CHANNELINDEX channel)
+//--------------------------------------------------
{
UINT m = 1 << (channel&7);
- return (MultiSplitRecordMask[channel>>3] & m) ? TRUE : FALSE;
+ return (MultiSplitRecordMask[channel>>3] & m) ? true : false;
}
-BYTE CModDoc::IsChannelRecord(UINT channel)
-//-----------------------------------------
+BYTE CModDoc::IsChannelRecord(CHANNELINDEX channel)
+//-------------------------------------------------
{
if(IsChannelRecord1(channel)) return 1;
if(IsChannelRecord2(channel)) return 2;
return 0;
}
-void CModDoc::Record1Channel(UINT channel, BOOL select)
-//-----------------------------------------------------
+void CModDoc::Record1Channel(CHANNELINDEX channel, bool select)
+//-------------------------------------------------------------
{
UINT m = 1 << (channel&7);
@@ -1153,8 +1153,8 @@
}
}
-void CModDoc::Record2Channel(UINT channel, BOOL select)
-//-----------------------------------------------------
+void CModDoc::Record2Channel(CHANNELINDEX channel, bool select)
+//-------------------------------------------------------------
{
UINT m = 1 << (channel&7);
@@ -1168,7 +1168,7 @@
}
}
-void CModDoc::ReinitRecordState(BOOL unselect)
+void CModDoc::ReinitRecordState(bool unselect)
//--------------------------------------------
{
memset(MultiRecordMask, unselect ? 0 : 0xff, sizeof(MultiRecordMask));
@@ -1177,31 +1177,31 @@
// -! NEW_FEATURE#0015
-BOOL CModDoc::MuteSample(UINT nSample, BOOL bMute)
-//------------------------------------------------
+bool CModDoc::MuteSample(SAMPLEINDEX nSample, bool bMute)
+//-------------------------------------------------------
{
- if ((nSample < 1) || (nSample > m_SndFile.m_nSamples)) return FALSE;
+ if ((nSample < 1) || (nSample > m_SndFile.m_nSamples)) return false;
if (bMute) m_SndFile.Samples[nSample].uFlags |= CHN_MUTE;
else m_SndFile.Samples[nSample].uFlags &= ~CHN_MUTE;
- return TRUE;
+ return true;
}
-BOOL CModDoc::MuteInstrument(UINT nInstr, BOOL bMute)
-//---------------------------------------------------
+bool CModDoc::MuteInstrument(INSTRUMENTINDEX nInstr, bool bMute)
+//--------------------------------------------------------------
{
- if ((nInstr < 1) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return FALSE;
+ if ((nInstr < 1) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return false;
if (bMute) m_SndFile.Instruments[nInstr]->dwFlags |= ENV_MUTE;
else m_SndFile.Instruments[nInstr]->dwFlags &= ~ENV_MUTE;
- return TRUE;
+ return true;
}
-BOOL CModDoc::SurroundChannel(UINT nChn, BOOL bSurround)
-//------------------------------------------------------
+bool CModDoc::SurroundChannel(CHANNELINDEX nChn, bool bSurround)
+//--------------------------------------------------------------
{
DWORD d = (bSurround) ? CHN_SURROUND : 0;
- if (nChn >= m_SndFile.m_nChannels) return FALSE;
+ if (nChn >= m_SndFile.m_nChannels) return false;
if (!(m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))) d = 0;
if (d != (m_SndFile.ChnSettings[nChn].dwFlags & CHN_SURROUND))
{
@@ -1212,68 +1212,68 @@
}
if (d) m_SndFile.Chn[nChn].dwFlags |= CHN_SURROUND;
else m_SndFile.Chn[nChn].dwFlags &= ~CHN_SURROUND;
- return TRUE;
+ return true;
}
-BOOL CModDoc::SetChannelGlobalVolume(UINT nChn, UINT nVolume)
-//-----------------------------------------------------------
+bool CModDoc::SetChannelGlobalVolume(CHANNELINDEX nChn, UINT nVolume)
+//-------------------------------------------------------------------
{
- BOOL bOk = FALSE;
- if ((nChn >= m_SndFile.m_nChannels) || (nVolume > 64)) return FALSE;
+ bool bOk = false;
+ if ((nChn >= m_SndFile.m_nChannels) || (nVolume > 64)) return false;
if (m_SndFile.ChnSettings[nChn].nVolume != nVolume)
{
m_SndFile.ChnSettings[nChn].nVolume = nVolume;
if (m_SndFile.m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified();
- bOk = TRUE;
+ bOk = true;
}
m_SndFile.Chn[nChn].nGlobalVol = nVolume;
return bOk;
}
-BOOL CModDoc::SetChannelDefaultPan(UINT nChn, UINT nPan)
-//------------------------------------------------------
+bool CModDoc::SetChannelDefaultPan(CHANNELINDEX nChn, UINT nPan)
+//--------------------------------------------------------------
{
- BOOL bOk = FALSE;
- if ((nChn >= m_SndFile.m_nChannels) || (nPan > 256)) return FALSE;
+ bool bOk = false;
+ if ((nChn >= m_SndFile.m_nChannels) || (nPan > 256)) return false;
if (m_SndFile.ChnSettings[nChn].nPan != nPan)
{
m_SndFile.ChnSettings[nChn].nPan = nPan;
if (m_SndFile.m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT | MOD_TYPE_MPT)) SetModified();
- bOk = TRUE;
+ bOk = true;
}
m_SndFile.Chn[nChn].nPan = nPan;
return bOk;
}
-BOOL CModDoc::IsChannelMuted(UINT nChn) const
-//-------------------------------------------
+bool CModDoc::IsChannelMuted(CHANNELINDEX nChn) const
+//---------------------------------------------------
{
- if (nChn >= m_SndFile.m_nChannels) return TRUE;
- return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_MUTE) ? TRUE : FALSE;
+ if (nChn >= m_SndFile.m_nChannels) return true;
+ return (m_SndFile.ChnSettings[nChn].dwFlags & CHN_MUTE) ? true : false;
}
-BOOL CModDoc::IsSampleMuted(UINT nSample) const
-//---------------------------------------------
+bool CModDoc::IsSampleMuted(SAMPLEINDEX nSample) const
+//----------------------------------------------------
{
- if ((!nSample) || (nSample > m_SndFile.m_nSamples)) return FALSE;
- return (m_SndFile.Samples[nSample].uFlags & CHN_MUTE) ? TRUE : FALSE;
+ if ((!nSample) || (nSample > m_SndFile.m_nSamples)) return false;
+ return (m_SndFile.Samples[nSample].uFlags & CHN_MUTE) ? true : false;
}
-BOOL CModDoc::IsInstrumentMuted(UINT nInstr) const
-//------------------------------------------------
+bool CModDoc::IsInstrumentMuted(INSTRUMENTINDEX nInstr) const
+//-----------------------------------------------------------
{
- if ((!nInstr) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return FALSE;
- return (m_SndFile.Instruments[nInstr]->dwFlags & ENV_MUTE) ? TRUE : FALSE;
+ if ((!nInstr) || (nInstr > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nInstr])) return false;
+ return (m_SndFile.Instruments[nInstr]->dwFlags & ENV_MUTE) ? true : false;
}
-UINT CModDoc::GetPatternSize(UINT nPat) const
-//-------------------------------------------
+UINT CModDoc::GetPatternSize(PATTERNINDEX nPat) const
+//---------------------------------------------------
{
if ((nPat < m_SndFile.Patterns.Size()) && (m_SndFile.Patterns[nPat])) return m_SndFile.PatternSize[nPat];
return 0;
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-09-17 16:11:47 UTC (rev 368)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-09-18 18:48:59 UTC (rev 369)
@@ -150,8 +150,8 @@
void PostMessageToAllViews(UINT uMsg, WPARAM wParam=0, LPARAM lParam=0);
void SendMessageToActiveViews(UINT uMsg, WPARAM wParam=0, LPARAM lParam=0);
UINT GetModType() const { return m_SndFile.m_nType; }
- BOOL GetNumInstruments() const { return m_SndFile.m_nInstruments; }
- BOOL GetNumSamples() const { return m_SndFile.m_nSamples; }
+ INSTRUMENTINDEX GetNumInstruments() const { return m_SndFile.m_nInstruments; }
+ SAMPLEINDEX GetNumSamples() const { return m_SndFile.m_nSamples; }
BOOL AddToLog(LPCSTR lpszLog);
LPCSTR GetLog() const { return m_lpszLog; }
BOOL ClearLog();
@@ -211,33 +211,33 @@
BOOL NoteOff(UINT note, BOOL bFade=FALSE, UINT nins=-1, UINT nCurrentChn=-1); //rewbs.vstiLive: add params
BOOL IsNotePlaying(UINT note, UINT nsmp=0, UINT nins=0);
- BOOL MuteChannel(UINT nChn, BOOL bMute);
- BOOL MuteSample(UINT nSample, BOOL bMute);
- BOOL MuteInstrument(UINT nInstr, BOOL bMute);
+ bool MuteChannel(CHANNELINDEX nChn, bool bMute);
+ bool MuteSample(SAMPLEINDEX nSample, bool bMute);
+ bool MuteInstrument(INSTRUMENTINDEX nInstr, bool bMute);
// -> CODE#0012
// -> DESC="midi keyboard split"
- BOOL SoloChannel(UINT nChn, BOOL bSolo);
- BOOL IsChannelSolo(UINT nChn) const;
+ bool SoloChannel(CHANNELINDEX nChn, bool bSolo);
+ bool IsChannelSolo(CHANNELINDEX nChn) const;
// -! NEW_FEATURE#0012
- BOOL SurroundChannel(UINT nChn, BOOL bSurround);
- BOOL SetChannelGlobalVolume(UINT nChn, UINT nVolume);
- BOOL SetChannelDefaultPan(UINT nChn, UINT nPan);
- BOOL IsChannelMuted(UINT nChn) const;
- BOOL IsSampleMuted(UINT nSample) const;
- BOOL IsInstrumentMuted(UINT nInstr) const;
+ bool SurroundChannel(CHANNELINDEX nChn, bool bSurround);
+ bool SetChannelGlobalVolume(CHANNELINDEX nChn, UINT nVolume);
+ bool SetChannelDefaultPan(CHANNELINDEX nChn, UINT nPan);
+ bool IsChannelMuted(CHANNELINDEX nChn) const;
+ bool IsSampleMuted(SAMPLEINDEX nSample) const;
+ bool IsInstrumentMuted(INSTRUMENTINDEX nInstr) const;
// -> CODE#0015
// -> DESC="channels management dlg"
- BOOL NoFxChannel(UINT nChn, BOOL bNoFx, BOOL updateMix = TRUE);
- BOOL IsChannelNoFx(UINT nChn) const;
- BOOL IsChannelRecord1(UINT channel);
- BOOL IsChannelRecord2(UINT channel);
- BYTE IsChannelRecord(UINT channel);
- void Record1Channel(UINT channel, BOOL select = TRUE);
- void Record2Channel(UINT channel, BOOL select = TRUE);
- void ReinitRecordState(BOOL unselect = TRUE);
+ bool NoFxChannel(CHANNELINDEX nChn, bool bNoFx, bool updateMix = true);
+ bool IsChannelNoFx(CHANNELINDEX nChn) const;
+ bool IsChannelRecord1(CHANNELINDEX channel);
+ bool IsChannelRecord2(CHANNELINDEX channel);
+ BYTE IsChannelRecord(CHANNELINDEX channel);
+ void Record1Channel(CHANNELINDEX channel, bool select = true);
+ void Record2Channel(CHANNELINDEX channel, bool select = true);
+ void ReinitRecordState(bool unselect = true);
// -! NEW_FEATURE#0015
- UINT GetNumChannels() const { return m_SndFile.m_nChannels; }
- UINT GetPatternSize(UINT nPat) const;
+ CHANNELINDEX GetNumChannels() const { return m_SndFile.m_nChannels; }
+ UINT GetPatternSize(PATTERNINDEX nPat) const;
BOOL AdjustEndOfSample(UINT nSample);
BOOL IsChildSample(UINT nIns, UINT nSmp) const;
UINT FindSampleParent(UINT nSmp) const;
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-09-17 16:11:47 UTC (rev 368)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-09-18 18:48:59 UTC (rev 369)
@@ -2537,8 +2537,8 @@
pModDoc = GetDocumentFromItem(hItem);
if (pModDoc)
{
- UINT nSamples = pModDoc->GetNumSamples();
- UINT nInstruments = pModDoc->GetNumInstruments();
+ SAMPLEINDEX nSamples = pModDoc->GetNumSamples();
+ INSTRUMENTINDEX nInstruments = pModDoc->GetNumInstruments();
if ((dwItemType == MODITEM_SAMPLE) && (!nInstruments))
{
for (UINT i=1; i<=nSamples; i++)
@@ -2568,8 +2568,8 @@
pModDoc = GetDocumentFromItem(hItem);
if (pModDoc)
{
- UINT nSamples = pModDoc->GetNumSamples();
- UINT nInstruments = pModDoc->GetNumInstruments();
+ SAMPLEINDEX nSamples = pModDoc->GetNumSamples();
+ INSTRUMENTINDEX nInstruments = pModDoc->GetNumInstruments();
if ((dwItemType == MODITEM_SAMPLE) || (dwItemType == MODITEM_INSTRUMENT))
{
for (UINT i=1; i<=nSamples; i++)
Modified: trunk/OpenMPT/soundlib/Sampleio.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-17 16:11:47 UTC (rev 368)
+++ trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-18 18:48:59 UTC (rev 369)
@@ -1362,9 +1362,9 @@
if (!k)
{
xih.vibtype = Samples[n].nVibType;
- xih.vibsweep = Samples[n].nVibSweep;
- xih.vibdepth = Samples[n].nVibDepth;
- xih.vibrate = Samples[n].nVibRate;
+ xih.vibsweep = min(Samples[n].nVibSweep, 255);
+ xih.vibdepth = min(Samples[n].nVibDepth, 15);
+ xih.vibrate = min(Samples[n].nVibRate, 63);
}
if (nsamples < 32) smptable[nsamples++] = n;
k = nsamples - 1;
@@ -1693,7 +1693,7 @@
if (pSmp->nPan > 256) pSmp->nPan = 256;
if (pis->dfp & 0x80) pSmp->uFlags |= CHN_PANNING;
pSmp->nVibType = autovibit2xm[pis->vit & 7];
- pSmp->nVibSweep = (pis->vir + 3) / 4;
+ pSmp->nVibSweep = pis->vir;
pSmp->nVibDepth = pis->vid;
pSmp->nVibRate = pis->vis;
UINT flags = (pis->cvt & 1) ? RS_PCM8S : RS_PCM8U;
@@ -1944,9 +1944,9 @@
itss.vol = psmp->nVolume >> 2;
itss.dfp = psmp->nPan >> 2;
itss.vit = autovibxm2it[psmp->nVibType & 7];
- itss.vir = (psmp->nVibSweep < 64) ? psmp->nVibSweep*4 : 255;
- itss.vid = psmp->nVibDepth;
- itss.vis = psmp->nVibRate;
+ itss.vir = min(psmp->nVibSweep, 255);
+ itss.vid = min(psmp->nVibDepth, 32);
+ itss.vis = min(psmp->nVibRate, 64);
if (psmp->uFlags & CHN_PANNING) itss.dfp |= 0x80;
itss.cvt = 0x01;
smpsize = psmp->nLength;
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2009-09-17 16:11:47 UTC (rev 368)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2009-09-18 18:48:59 UTC (rev 369)
@@ -40,6 +40,7 @@
BYTE nVibSweep;
BYTE nVibDepth;
BYTE nVibRate;
+ CHAR name[32];
CHAR filename[22];
// Return the size of one (elementary) sample in bytes.
@@ -545,7 +546,10 @@
public: // for Editing
CModDoc* m_pModDoc;
- UINT m_nType, m_nChannels, m_nSamples, m_nInstruments;
+ UINT m_nType;
+ CHANNELINDEX m_nChannels;
+ SAMPLEINDEX m_nSamples;
+ INSTRUMENTINDEX m_nInstruments;
UINT m_nDefaultSpeed, m_nDefaultTempo, m_nDefaultGlobalVolume;
DWORD m_dwSongFlags; // Song flags SONG_XXXX
bool m_bIsRendering;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-17 16:11:58
|
Revision: 368
http://modplug.svn.sourceforge.net/modplug/?rev=368&view=rev
Author: saga-games
Date: 2009-09-17 16:11:47 +0000 (Thu, 17 Sep 2009)
Log Message:
-----------
[Fix] Sample Editor: Limit sample vibrato fields properly. Vibrato Sweep ranges from 0 to 255 now.
[Fix] IT Compatibility: Better sample vibrato compatibility. Vibrato Sweep isn't perfect yet, though.
[Mod] Sequence view: Also grey out "Render to wave" menu item if no valid order is selected
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
trunk/OpenMPT/soundlib/Sndmix.cpp
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-16 22:46:46 UTC (rev 367)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-17 16:11:47 UTC (rev 368)
@@ -897,7 +897,7 @@
}
}
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
- AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_RENDER, "Render to &Wave");
+ AppendMenu(hMenu, MF_STRING | greyed, ID_ORDERLIST_RENDER, "Render to &Wave");
ClientToScreen(&pt);
::TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL);
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-16 22:46:46 UTC (rev 367)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-17 16:11:47 UTC (rev 368)
@@ -228,14 +228,24 @@
m_SpinPanning.SetRange(0, 64);
}
//end rewbs.fix36944
+
+ // Auto vibrato
m_ComboAutoVib.AddString("Sine");
m_ComboAutoVib.AddString("Square");
m_ComboAutoVib.AddString("Ramp Up");
m_ComboAutoVib.AddString("Ramp Down");
m_ComboAutoVib.AddString("Random");
- m_SpinVibSweep.SetRange(0, 64);
- m_SpinVibDepth.SetRange(0, 64);
- m_SpinVibRate.SetRange(0, 64);
+ m_SpinVibSweep.SetRange(0, 255);
+ if(m_pSndFile->m_nType & MOD_TYPE_XM)
+ {
+ m_SpinVibDepth.SetRange(0, 15);
+ m_SpinVibRate.SetRange(0, 63);
+ } else
+ {
+ m_SpinVibDepth.SetRange(0, 32);
+ m_SpinVibRate.SetRange(0, 64);
+ }
+
for (UINT i=BASENOTE_MIN; i<BASENOTE_MAX; i++)
{
CHAR s[32];
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-16 22:46:46 UTC (rev 367)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-17 16:11:47 UTC (rev 368)
@@ -751,7 +751,7 @@
pSmp->nVibType = autovibit2xm[pis.vit & 7];
pSmp->nVibRate = pis.vis;
pSmp->nVibDepth = pis.vid & 0x7F;
- pSmp->nVibSweep = (pis.vir + 3) / 4;
+ pSmp->nVibSweep = pis.vir;
if(pis.length){
pSmp->nLength = pis.length;
if (pSmp->nLength > MAX_SAMPLE_LENGTH) pSmp->nLength = MAX_SAMPLE_LENGTH;
@@ -1231,7 +1231,7 @@
pSmp->nVibType = autovibit2xm[pis->vit & 7];
pSmp->nVibRate = pis->vis;
pSmp->nVibDepth = pis->vid & 0x7F;
- pSmp->nVibSweep = (pis->vir + 3) / 4;
+ pSmp->nVibSweep = pis->vir; //(pis->vir + 3) / 4;
if ((pis->samplepointer) && (pis->samplepointer < dwMemLength) && (pis->length))
{
pSmp->nLength = pis->length;
@@ -1719,9 +1719,9 @@
itss.vol = psmp->nVolume >> 2;
itss.dfp = psmp->nPan >> 2;
itss.vit = autovibxm2it[psmp->nVibType & 7];
- itss.vis = psmp->nVibRate;
- itss.vid = psmp->nVibDepth;
- itss.vir = (psmp->nVibSweep < 64) ? psmp->nVibSweep * 4 : 255;
+ itss.vis = min(psmp->nVibRate, 64);
+ itss.vid = min(psmp->nVibDepth, 32);
+ itss.vir = min(psmp->nVibSweep, 255); //(psmp->nVibSweep < 64) ? psmp->nVibSweep * 4 : 255;
if (psmp->uFlags & CHN_PANNING) itss.dfp |= 0x80;
if ((psmp->pSample) && (psmp->nLength)) itss.cvt = 0x01;
UINT flags = RS_PCM8S;
@@ -2351,9 +2351,9 @@
itss.vol = psmp->nVolume >> 2;
itss.dfp = psmp->nPan >> 2;
itss.vit = autovibxm2it[psmp->nVibType & 7];
- itss.vis = psmp->nVibRate;
- itss.vid = psmp->nVibDepth;
- itss.vir = (psmp->nVibSweep < 64) ? psmp->nVibSweep * 4 : 255;
+ itss.vis = min(psmp->nVibRate, 64);
+ itss.vid = min(psmp->nVibDepth, 32);
+ itss.vir = min(psmp->nVibSweep, 255); //(psmp->nVibSweep < 64) ? psmp->nVibSweep * 4 : 255;
if (psmp->uFlags & CHN_PANNING) itss.dfp |= 0x80;
if ((psmp->pSample) && (psmp->nLength)) itss.cvt = 0x01;
UINT flags = RS_PCM8S;
@@ -2987,9 +2987,9 @@
itss.vol = psmp->nVolume >> 2;
itss.dfp = psmp->nPan >> 2;
itss.vit = autovibxm2it[psmp->nVibType & 7];
- itss.vis = psmp->nVibRate;
- itss.vid = psmp->nVibDepth;
- itss.vir = (psmp->nVibSweep < 64) ? psmp->nVibSweep * 4 : 255;
+ itss.vis = min(psmp->nVibRate, 64);
+ itss.vid = min(psmp->nVibDepth, 32);
+ itss.vir = min(psmp->nVibSweep, 255);
if (psmp->uFlags & CHN_PANNING) itss.dfp |= 0x80;
if ((psmp->pSample) && (psmp->nLength)) itss.cvt = 0x01;
UINT flags = RS_PCM8S;
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-16 22:46:46 UTC (rev 367)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-17 16:11:47 UTC (rev 368)
@@ -954,9 +954,9 @@
{
MODSAMPLE *pvib = &Samples[smptable[0]];
xmsh.vibtype = pvib->nVibType;
- xmsh.vibsweep = pvib->nVibSweep;
- xmsh.vibdepth = pvib->nVibDepth;
- xmsh.vibrate = pvib->nVibRate;
+ xmsh.vibsweep = min(pvib->nVibSweep, 0xFF);
+ xmsh.vibdepth = min(pvib->nVibDepth, 0x0F);
+ xmsh.vibrate = min(pvib->nVibRate, 0x3F);
}
WORD samples = xmih.samples;
xmih.samples = LittleEndianW(xmih.samples);
Modified: trunk/OpenMPT/soundlib/Sndmix.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-09-16 22:46:46 UTC (rev 367)
+++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-09-17 16:11:47 UTC (rev 368)
@@ -1448,19 +1448,28 @@
//if(IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nPan = pChn->nRealPan; // TODO
}
int nPeriodFrac = 0;
- // Instrument Auto-Vibrato
+ // Sample Auto-Vibrato
if ((pChn->pModSample) && (pChn->pModSample->nVibDepth))
{
MODSAMPLE *pSmp = pChn->pModSample;
- if (pSmp->nVibSweep == 0)
+ if (pSmp->nVibSweep == 0 && !IsCompatibleMode(TRK_IMPULSETRACKER))
{
pChn->nAutoVibDepth = pSmp->nVibDepth << 8;
} else
{
if (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))
{
- pChn->nAutoVibDepth += pSmp->nVibSweep << 3;
+ if(IsCompatibleMode(TRK_IMPULSETRACKER))
+ {
+ // TODO
+ pChn->nAutoVibDepth += pSmp->nVibSweep << 3;
+ } else
+ {
+ /* Note: changed bitshift from 3 to 1 as the variable is not divided by 4 in the IT loader anymore
+ - so we divide sweep by 4 here. */
+ pChn->nAutoVibDepth += pSmp->nVibSweep << 1;
+ }
} else
if (!(pChn->dwFlags & CHN_KEYOFF))
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-16 22:46:55
|
Revision: 367
http://modplug.svn.sourceforge.net/modplug/?rev=367&view=rev
Author: saga-games
Date: 2009-09-16 22:46:46 +0000 (Wed, 16 Sep 2009)
Log Message:
-----------
[Fix] XM Loader: Can now load XM Version 1.02 and 1.03. Made XM Loader and Saver a bit more readable.
[Imp] XM Loader: Detect non-mpt modules more reliably
[Mod] Color Presets: Use app directory as default directory in file dialog
[Ref] Made GetZxxType / CreateZxxFromType static so they can be used in CTrackApp for initialization
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-09-16 19:05:00 UTC (rev 366)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-09-16 22:46:46 UTC (rev 367)
@@ -181,8 +181,8 @@
int MacroToPlugParam(CString value); //rewbs.xinfo
int MacroToMidiCC(CString value);
int FindMacroForParam(long param);
- int GetZxxType(const CHAR (&szMidiZXXExt)[128 * 32]);
- void CreateZxxFromType(CHAR (&szMidiZXXExt)[128 * 32], int iZxxType);
+ static int GetZxxType(const CHAR (&szMidiZXXExt)[128 * 32]);
+ static void CreateZxxFromType(CHAR (&szMidiZXXExt)[128 * 32], int iZxxType);
void SongProperties();
// operations
public:
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-16 19:05:00 UTC (rev 366)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-16 22:46:46 UTC (rev 367)
@@ -562,8 +562,8 @@
"OpenMPT Color Schemes|*.mptcolor|"
"All Files (*.*)|*.*||",
this);
+ dlg.m_ofn.lpstrInitialDir = CMainFrame::m_csExecutableDirectoryPath;
if (dlg.DoModal() != IDOK) return;
-
TCHAR sFilename[MAX_PATH];
strcpy(sFilename, dlg.GetPathName());
@@ -584,6 +584,7 @@
OFN_HIDEREADONLY| OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN,
"OpenMPT Color Schemes|*.mptcolor|",
this);
+ dlg.m_ofn.lpstrInitialDir = CMainFrame::m_csExecutableDirectoryPath;
if (dlg.DoModal() != IDOK) return;
TCHAR sFilename[MAX_PATH];
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-16 19:05:00 UTC (rev 366)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-16 22:46:46 UTC (rev 367)
@@ -622,7 +622,7 @@
strcpy(&m_MidiCfg.szMidiGlb[MIDIOUT_NOTEOFF*32], "9c n 0");
strcpy(&m_MidiCfg.szMidiGlb[MIDIOUT_PROGRAM*32], "Cc p");
strcpy(&m_MidiCfg.szMidiSFXExt[0], "F0F000z");
- for (int iz=0; iz<16; iz++) wsprintf(&m_MidiCfg.szMidiZXXExt[iz*32], "F0F001%02X", iz*8);
+ CModDoc::CreateZxxFromType(m_MidiCfg.szMidiZXXExt, 1);
#ifdef UPDATECHECKENABLED
m_pRequestContext = NULL;
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-16 19:05:00 UTC (rev 366)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-16 22:46:46 UTC (rev 367)
@@ -24,16 +24,16 @@
#pragma pack(1)
typedef struct tagXMFILEHEADER
{
- DWORD size;
- WORD norder;
- WORD restartpos;
- WORD channels;
- WORD patterns;
- WORD instruments;
- WORD flags;
- WORD speed;
- WORD tempo;
- BYTE order[256];
+ WORD xmversion; // current: 0x0104
+ DWORD size; // header size
+ WORD orders; // number of orders
+ WORD restartpos; // restart position
+ WORD channels; // number of channels
+ WORD patterns; // number of patterns
+ WORD instruments; // number of instruments
+ WORD flags; // song flags
+ WORD speed; // default speed
+ WORD tempo; // default tempo
} XMFILEHEADER;
@@ -57,8 +57,13 @@
BYTE vtype, ptype;
BYTE vibtype, vibsweep, vibdepth, vibrate;
WORD volfade;
- WORD res;
- BYTE reserved1[20];
+ // midi extensions (not read by MPT)
+ BYTE midienabled; // 0/1
+ BYTE midichannel; // 0...15
+ WORD midiprogram; // 0...127
+ WORD pitchwheelrange; // 0...36 (halftones)
+ BYTE mutecomputer; // 0/1
+ BYTE reserved1[15];
} XMSAMPLEHEADER;
typedef struct tagXMSAMPLESTRUCT
@@ -77,138 +82,80 @@
#pragma pack()
-bool CSoundFile::ReadXM(const BYTE *lpStream, DWORD dwMemLength)
-//--------------------------------------------------------------
+// Read .XM patterns
+DWORD ReadXMPatterns(const BYTE *lpStream, DWORD dwMemLength, DWORD dwMemPos, XMFILEHEADER *xmheader, CSoundFile *pSndFile)
+//-------------------------------------------------------------------------------------------------------------------------
{
- XMSAMPLEHEADER xmsh;
- XMSAMPLESTRUCT xmss;
- DWORD dwMemPos, dwHdrSize;
- WORD norders=0, restartpos=0, channels=0, patterns=0, instruments=0;
- WORD xmflags=0;
- BYTE InstUsed[256];
-// -> CODE#0006
-// -> DESC="misc quantity changes"
-// BYTE channels_used[MAX_CHANNELS];
- BYTE channels_used[MAX_BASECHANNELS];
-// -! BEHAVIOUR_CHANGE#0006
+ BYTE patterns_used[256];
BYTE pattern_map[256];
- BYTE samples_used[(MAX_SAMPLES+7)/8];
- UINT unused_samples;
- bool bMadeWithModPlug = false, bProbablyMadeWithModPlug = false;
- // set this here already because XMs compressed with BoobieSqueezer will exit the function early
- SetModFlag(MSF_COMPATIBLE_PLAY, true);
-
- m_nChannels = 0;
- if ((!lpStream) || (dwMemLength < 0xAA)) return false; // the smallest XM I know is 174 Bytes
- if (_strnicmp((LPCSTR)lpStream, "Extended Module", 15)) return false;
-
- memcpy(m_szNames[0], lpStream + 17, 20);
- // look for null-terminated song name - that's most likely a tune made with modplug
- for(int i = 0; i < 20; i++)
- if(lpStream[17 + i] == 0) bProbablyMadeWithModPlug = true;
-
- dwHdrSize = LittleEndian(*((DWORD *)(lpStream+60)));
- norders = LittleEndianW(*((WORD *)(lpStream+64)));
- if ((!norders) || (norders > MAX_ORDERS)) return false;
- restartpos = LittleEndianW(*((WORD *)(lpStream+66)));
- channels = LittleEndianW(*((WORD *)(lpStream+68)));
-// -> CODE#0006
-// -> DESC="misc quantity changes"
-// if ((!channels) || (channels > 64)) return false;
- if ((!channels) || (channels > MAX_BASECHANNELS)) return false;
-// -! BEHAVIOUR_CHANGE#0006
-
- m_nType = MOD_TYPE_XM;
- m_nMinPeriod = 27;
- m_nMaxPeriod = 54784;
- m_nChannels = channels;
- if (restartpos < norders) m_nRestartPos = restartpos;
- patterns = CLAMP(LittleEndianW(*((WORD *)(lpStream+70))), 0, 256);
- instruments = LittleEndianW(*((WORD *)(lpStream+72)));
- if (instruments >= MAX_INSTRUMENTS) instruments = MAX_INSTRUMENTS-1;
- m_nInstruments = instruments;
- m_nSamples = 0;
- memcpy(&xmflags, lpStream + 74, 2);
- xmflags = LittleEndianW(xmflags);
- if (xmflags & 1) m_dwSongFlags |= SONG_LINEARSLIDES;
- if (xmflags & 0x1000) m_dwSongFlags |= SONG_EXFILTERRANGE;
- m_nDefaultSpeed = CLAMP(LittleEndianW(*((WORD *)(lpStream+76))), 1, 31);
-// -> CODE#0016
-// -> DESC="default tempo update"
- m_nDefaultTempo = CLAMP(LittleEndianW(*((WORD *)(lpStream+78))), 32, 512);
-// -! BEHAVIOUR_CHANGE#0016
- Order.ReadAsByte(lpStream+80, norders, dwMemLength-80);
- memset(InstUsed, 0, sizeof(InstUsed));
- if (patterns > MAX_PATTERNS)
+ memset(patterns_used, 0, sizeof(patterns_used));
+ if (xmheader->patterns > MAX_PATTERNS)
{
UINT i, j;
- for (i=0; i<norders; i++)
+ for (i = 0; i < xmheader->orders; i++)
{
- if (Order[i] < patterns) InstUsed[Order[i]] = true;
+ if (pSndFile->Order[i] < xmheader->patterns) patterns_used[pSndFile->Order[i]] = true;
}
j = 0;
- for (i=0; i<256; i++)
+ for (i = 0; i < 256; i++)
{
- if (InstUsed[i]) pattern_map[i] = j++;
+ if (patterns_used[i]) pattern_map[i] = j++;
}
- for (i=0; i<256; i++)
+ for (i = 0; i < 256; i++)
{
- if (!InstUsed[i])
+ if (!patterns_used[i])
{
pattern_map[i] = (j < MAX_PATTERNS) ? j : 0xFE;
j++;
}
}
- for (i=0; i<norders; i++)
+ for (i = 0; i < xmheader->orders; i++)
{
- Order[i] = pattern_map[Order[i]];
+ pSndFile->Order[i] = pattern_map[pSndFile->Order[i]];
}
} else
{
- for (UINT i=0; i<256; i++) pattern_map[i] = i;
+ for (UINT i = 0; i < 256; i++) pattern_map[i] = i;
}
- memset(InstUsed, 0, sizeof(InstUsed));
- dwMemPos = dwHdrSize + 60;
- if (dwMemPos + 8 >= dwMemLength) return true;
+ if (dwMemPos + 8 >= dwMemLength) return dwMemPos;
// Reading patterns
- memset(channels_used, 0, sizeof(channels_used));
- for (UINT ipat=0; ipat<patterns; ipat++)
+ for (UINT ipat = 0; ipat < xmheader->patterns; ipat++)
{
UINT ipatmap = pattern_map[ipat];
DWORD dwSize = 0;
- WORD rows=64, packsize=0;
+ WORD rows = 64, packsize = 0;
dwSize = LittleEndian(*((DWORD *)(lpStream + dwMemPos)));
- /*while ((dwMemPos + dwSize >= dwMemLength) || (dwSize & 0xFFFFFF00))
+
+ if(xmheader->xmversion == 0x0102)
{
- if (dwMemPos + 4 >= dwMemLength) break;
- dwMemPos++;
- dwSize = LittleEndian(*((DWORD *)(lpStream+dwMemPos)));
- }*/
- rows = LittleEndianW(*((WORD *)(lpStream + dwMemPos + 5)));
-// -> CODE#0008
-// -> DESC="#define to set pattern size"
-// if ((!rows) || (rows > 256)) rows = 64;
+ rows = *((BYTE *)(lpStream + dwMemPos + 5)) + 1;
+ packsize = LittleEndianW(*((WORD *)(lpStream + dwMemPos + 6)));
+ }
+ else
+ {
+ rows = LittleEndianW(*((WORD *)(lpStream + dwMemPos + 5)));
+ packsize = LittleEndianW(*((WORD *)(lpStream + dwMemPos + 7)));
+ }
+
if ((!rows) || (rows > MAX_PATTERN_ROWS)) rows = 64;
-// -> BEHAVIOUR_CHANGE#0008
- packsize = LittleEndianW(*((WORD *)(lpStream + dwMemPos + 7)));
- if (dwMemPos + dwSize + 4 > dwMemLength) return true;
+ if (dwMemPos + dwSize + 4 > dwMemLength) return 0;
dwMemPos += dwSize;
- if (dwMemPos + packsize > dwMemLength) return true;
+ if (dwMemPos + packsize > dwMemLength) return 0;
MODCOMMAND *p;
if (ipatmap < MAX_PATTERNS)
{
- if(Patterns.Insert(ipatmap, rows))
+ if(pSndFile->Patterns.Insert(ipatmap, rows))
return true;
if (!packsize) continue;
- p = Patterns[ipatmap];
+ p = pSndFile->Patterns[ipatmap];
} else p = NULL;
const BYTE *src = lpStream+dwMemPos;
UINT j=0;
for (UINT row=0; row<rows; row++)
{
- for (UINT chn=0; chn<m_nChannels; chn++)
+ for (UINT chn=0; chn < xmheader->channels; chn++)
{
if ((p) && (j < packsize))
{
@@ -231,10 +178,8 @@
}
if (p->note == 97) p->note = 0xFF; else
if ((p->note) && (p->note < 97)) p->note += 12;
- if (p->note) channels_used[chn] = 1;
- if (p->command | p->param) ConvertModCommand(p);
+ if (p->command | p->param) pSndFile->ConvertModCommand(p);
if (p->instr == 0xff) p->instr = 0;
- if (p->instr) InstUsed[p->instr] = TRUE;
if ((vol >= 0x10) && (vol <= 0x50))
{
p->volcmd = VOLCMD_VOLUME;
@@ -287,17 +232,77 @@
}
dwMemPos += packsize;
}
- // Wrong offset check
- while (dwMemPos + 4 < dwMemLength)
+ return dwMemPos;
+}
+
+bool CSoundFile::ReadXM(const BYTE *lpStream, DWORD dwMemLength)
+//--------------------------------------------------------------
+{
+ XMFILEHEADER xmheader;
+ XMSAMPLEHEADER xmsh;
+ XMSAMPLESTRUCT xmss;
+ DWORD dwMemPos;
+ BYTE samples_used[(MAX_SAMPLES + 7) / 8]; // for removing unused samples
+ UINT unused_samples; // dito
+
+ bool bMadeWithModPlug = false, bProbablyMadeWithModPlug = false, bIsFT2 = false;
+ // set this here already because XMs compressed with BoobieSqueezer will exit the function early
+ SetModFlag(MSF_COMPATIBLE_PLAY, true);
+
+ m_nChannels = 0;
+ if ((!lpStream) || (dwMemLength < 0xAA)) return false; // the smallest XM I know is 174 Bytes
+ if (_strnicmp((LPCSTR)lpStream, "Extended Module", 15)) return false;
+
+ memcpy(m_szNames[0], lpStream + 17, 20);
+ // look for null-terminated song name - that's most likely a tune made with modplug
+ for(int i = 0; i < 20; i++)
+ if(lpStream[17 + i] == 0) bProbablyMadeWithModPlug = true;
+
+ // load and convert header
+ memcpy(&xmheader, lpStream + 58, sizeof(XMFILEHEADER));
+ xmheader.size = LittleEndian(xmheader.size);
+ xmheader.xmversion = LittleEndianW(xmheader.xmversion);
+ xmheader.orders = LittleEndianW(xmheader.orders);
+ xmheader.restartpos = LittleEndianW(xmheader.restartpos);
+ xmheader.channels = LittleEndianW(xmheader.channels);
+ xmheader.patterns = LittleEndianW(xmheader.patterns);
+ xmheader.instruments = LittleEndianW(xmheader.instruments);
+ xmheader.flags = LittleEndianW(xmheader.flags);
+ xmheader.speed = LittleEndianW(xmheader.speed);
+ xmheader.tempo = LittleEndianW(xmheader.tempo);
+
+ m_nType = MOD_TYPE_XM;
+ m_nMinPeriod = 27;
+ m_nMaxPeriod = 54784;
+
+ if ((!xmheader.orders) || (xmheader.orders > MAX_ORDERS)) return false;
+ if ((!xmheader.channels) || (xmheader.channels > MAX_BASECHANNELS)) return false;
+ if (xmheader.channels > 32) bMadeWithModPlug = true;
+ m_nRestartPos = xmheader.restartpos;
+ m_nChannels = xmheader.channels;
+ m_nInstruments = min(xmheader.instruments, MAX_INSTRUMENTS - 1);
+ m_nSamples = 0;
+ m_nDefaultSpeed = CLAMP(xmheader.speed, 1, 31);
+ m_nDefaultTempo = CLAMP(xmheader.tempo, 32, 512);
+
+ if(xmheader.flags & 1) m_dwSongFlags |= SONG_LINEARSLIDES;
+ if(xmheader.flags & 0x1000) m_dwSongFlags |= SONG_EXFILTERRANGE;
+
+ Order.ReadAsByte(lpStream + 80, xmheader.orders, dwMemLength - 80);
+
+ dwMemPos = xmheader.size + 60;
+
+ if(xmheader.xmversion >= 0x0104)
{
- DWORD d = LittleEndian(*((DWORD *)(lpStream+dwMemPos)));
- if (d < 0x300) break;
- dwMemPos++;
+ if (dwMemPos + 8 >= dwMemLength) return true;
+ dwMemPos = ReadXMPatterns(lpStream, dwMemLength, dwMemPos, &xmheader, this);
+ if(dwMemPos == 0) return true;
}
+
memset(samples_used, 0, sizeof(samples_used));
unused_samples = 0;
// Reading instruments
- for (UINT iIns=1; iIns<=instruments; iIns++)
+ for (INSTRUMENTINDEX iIns = 1; iIns <= m_nInstruments; iIns++)
{
XMINSTRUMENTHEADER *pih;
BYTE flags[32];
@@ -318,9 +323,6 @@
Instruments[iIns]->nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE;
memcpy(Instruments[iIns]->name, pih->name, 22);
- // look for null-terminated instr name - that's most likely a tune made with modplug
- for(int i = 0; i < 22; i++)
- if(pih->name[i] == 0) bProbablyMadeWithModPlug = true;
if ((nsamples = pih->samples) > 0)
{
@@ -344,7 +346,12 @@
xmsh.penv[i] = LittleEndianW(xmsh.penv[i]);
}
xmsh.volfade = LittleEndianW(xmsh.volfade);
- xmsh.res = LittleEndianW(xmsh.res);
+ xmsh.midiprogram = LittleEndianW(xmsh.midiprogram);
+ xmsh.pitchwheelrange = LittleEndianW(xmsh.pitchwheelrange);
+
+ if(xmsh.midichannel != 0 || xmsh.midienabled != 0 || xmsh.midiprogram != 0 || xmsh.mutecomputer != 0 || xmsh.pitchwheelrange != 0)
+ bIsFT2 = true; // definitely not MPT. (or any other tracker)
+
dwMemPos += LittleEndian(pih->size);
} else
{
@@ -547,9 +554,6 @@
pSmp->nVibRate = xmsh.vibrate;
memcpy(pSmp->filename, xmss.name, 22);
pSmp->filename[21] = 0;
- // look for null-terminated sample name - that's most likely a tune made with modplug
- for(int i = 0; i < 22; i++)
- if(xmss.name[i] == 0) bProbablyMadeWithModPlug = true;
}
#if 0
if ((xmsh.reserved2 > nsamples) && (xmsh.reserved2 <= 16))
@@ -557,16 +561,35 @@
dwMemPos += (((UINT)xmsh.reserved2) - nsamples) * xmsh.shsize;
}
#endif
- for (UINT ismpd=0; ismpd<nsamples; ismpd++)
+ if(xmheader.xmversion >= 0x0104)
{
- if ((samplemap[ismpd]) && (samplesize[ismpd]) && (dwMemPos < dwMemLength))
+ for (UINT ismpd = 0; ismpd < nsamples; ismpd++)
{
- ReadSample(&Samples[samplemap[ismpd]], flags[ismpd], (LPSTR)(lpStream + dwMemPos), dwMemLength - dwMemPos);
+ if ((samplemap[ismpd]) && (samplesize[ismpd]) && (dwMemPos < dwMemLength))
+ {
+ ReadSample(&Samples[samplemap[ismpd]], flags[ismpd], (LPSTR)(lpStream + dwMemPos), dwMemLength - dwMemPos);
+ }
+ dwMemPos += samplesize[ismpd];
+ if (dwMemPos >= dwMemLength) break;
}
- dwMemPos += samplesize[ismpd];
+ }
+ }
+
+ if(xmheader.xmversion < 0x0104)
+ {
+ // Load Patterns and Samples (Version 1.02 and 1.03)
+ if (dwMemPos + 8 >= dwMemLength) return true;
+ dwMemPos = ReadXMPatterns(lpStream, dwMemLength, dwMemPos, &xmheader, this);
+ if(dwMemPos == 0) return true;
+
+ for(SAMPLEINDEX iSmp = 1; iSmp <= m_nSamples; iSmp++)
+ {
+ ReadSample(&Samples[iSmp], (Samples[iSmp].uFlags & CHN_16BIT) ? RS_PCM16D : RS_PCM8D, (LPSTR)(lpStream + dwMemPos), dwMemLength - dwMemPos);
+ dwMemPos += Samples[iSmp].GetSampleSizeInBytes();
if (dwMemPos >= dwMemLength) break;
}
}
+
// Read song comments: "TEXT"
if ((dwMemPos + 8 < dwMemLength) && (LittleEndian(*((DWORD *)(lpStream+dwMemPos))) == 0x74786574))
{
@@ -640,7 +663,7 @@
// Check various things to find out whether this has been made with MPT.
// Null chars in names -> most likely made with MPT, which disguises as FT2
- if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v2.00 ", 20) && bProbablyMadeWithModPlug) bMadeWithModPlug = true;
+ if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v2.00 ", 20) && bProbablyMadeWithModPlug && !bIsFT2) bMadeWithModPlug = true;
if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v 2.00 ", 20))
{
// Early MPT 1.0 alpha/beta versions
@@ -701,7 +724,7 @@
//BYTE s[64*64*5];
vector<BYTE> s(64*64*5, 0);
- XMFILEHEADER header;
+ XMFILEHEADER xmheader;
XMINSTRUMENTHEADER xmih;
XMSAMPLEHEADER xmsh;
XMSAMPLESTRUCT xmss;
@@ -718,21 +741,22 @@
fwrite(m_szNames[0], 20, 1, f);
s[0] = 0x1A;
lstrcpy((LPSTR)&s[1], (nPacking) ? "MOD Plugin packed " : "OpenMPT " MPT_VERSION_STR " ");
- s[21] = 0x04; // Version number
- s[22] = 0x01; // XM Format v1.04
- fwrite(&s[0], 23, 1, f);
+ fwrite(&s[0], 21, 1, f);
+
// Writing song header
- memset(&header, 0, sizeof(header));
- header.size = sizeof(XMFILEHEADER);
- header.norder = 0;
- header.restartpos = m_nRestartPos;
+ memset(&xmheader, 0, sizeof(xmheader));
+ xmheader.xmversion = LittleEndianW(0x0104); // XM Format v1.04
+ xmheader.size = sizeof(XMFILEHEADER) - 2; // minus the version field
+ xmheader.restartpos = LittleEndianW(m_nRestartPos);
- header.channels = (m_nChannels + 1) & 0xFFFE; // avoid odd channel count for FT2 compatibility
+ xmheader.channels = (m_nChannels + 1) & 0xFFFE; // avoid odd channel count for FT2 compatibility
if(m_nChannels & 1) bAddChannel = true;
- if(bCompatibilityExport && header.channels > 32)
- header.channels = 32;
+ if(bCompatibilityExport && xmheader.channels > 32)
+ xmheader.channels = 32;
+ if(xmheader.channels > MAX_BASECHANNELS) xmheader.channels = MAX_BASECHANNELS;
+ xmheader.channels = LittleEndianW(xmheader.channels);
- header.patterns = 0;
+ xmheader.patterns = 0;
/*for (i=0; i<MAX_ORDERS; i++) {
header.norder++;
if ((Order[i] >= header.patterns) && (Order[i] < MAX_PATTERNS)) header.patterns = Order[i]+1;
@@ -740,33 +764,37 @@
if(Order.GetLength() < MAX_ORDERS)
Order.resize(MAX_ORDERS);
- for (i=MAX_ORDERS-1; i>=0; i--) { // walk backwards over orderlist
- if ((Order[i]!=0xFF) && (header.norder==0)) {
- header.norder=i+1; //find last used order
+ WORD nOrders = Order.GetLengthTailTrimmed(), nPatterns = 0;
+ xmheader.orders = LittleEndianW(nOrders);
+ xmheader.size = LittleEndian(xmheader.size + nOrders);
+
+ for (i = 0; i < nOrders; i++) { // walk over orderlist and find last used pattern
+ if((Order[i] >= nPatterns) && (Order[i] < MAX_PATTERNS)) {
+ nPatterns = Order[i] + 1;
}
- if ((Order[i] >= header.patterns) && (Order[i] < MAX_PATTERNS)) {
- header.patterns = Order[i]+1; //find last pattern
- }
}
+ xmheader.patterns = LittleEndianW(nPatterns);
- header.instruments = m_nInstruments;
- if (!header.instruments) header.instruments = m_nSamples;
- header.flags = (m_dwSongFlags & SONG_LINEARSLIDES) ? 0x01 : 0x00;
- if (m_dwSongFlags & SONG_EXFILTERRANGE) header.flags |= 0x1000;
+ if(m_nInstruments > 0)
+ xmheader.instruments = LittleEndianW(m_nInstruments);
+ else
+ xmheader.instruments = LittleEndianW(m_nSamples);
+
+ xmheader.flags = (m_dwSongFlags & SONG_LINEARSLIDES) ? 0x01 : 0x00;
+ if (m_dwSongFlags & SONG_EXFILTERRANGE) xmheader.flags |= 0x1000;
+ xmheader.flags = LittleEndianW(xmheader.flags);
+
if(bCompatibilityExport)
- {
- header.tempo = CLAMP(m_nDefaultTempo, 32, 255);
- }
+ xmheader.tempo = LittleEndianW(CLAMP(m_nDefaultTempo, 32, 255));
else
- {
- header.tempo = m_nDefaultTempo;
- }
- header.speed = CLAMP(m_nDefaultSpeed, 1, 31);
- Order.WriteToByteArray(header.order, header.norder, 256);
+ xmheader.tempo = LittleEndianW(CLAMP(m_nDefaultTempo, 32, 512));
+ xmheader.speed = LittleEndianW(CLAMP(m_nDefaultSpeed, 1, 31));
- fwrite(&header, 1, sizeof(header), f);
+ fwrite(&xmheader, 1, sizeof(xmheader), f);
+ Order.WriteAsByte(f, nOrders);
+
// Writing patterns
- for (i=0; i<header.patterns; i++) if (Patterns[i])
+ for (i = 0; i < nPatterns; i++) if (Patterns[i])
{
MODCOMMAND *p = Patterns[i];
UINT len = 0;
@@ -851,7 +879,7 @@
fwrite(xmph, 1, 9, f);
}
// Writing instruments
- for (i=1; i<=header.instruments; i++)
+ for (i = 1; i <= xmheader.instruments; i++)
{
MODSAMPLE *pSmp;
WORD smptable[32];
@@ -860,7 +888,7 @@
memset(&smptable, 0, sizeof(smptable));
memset(&xmih, 0, sizeof(xmih));
memset(&xmsh, 0, sizeof(xmsh));
- xmih.size = sizeof(xmih) + sizeof(xmsh);
+ xmih.size = LittleEndian(sizeof(xmih) + sizeof(xmsh));
memcpy(xmih.name, m_szNames[i], 22);
xmih.type = 0;
xmih.samples = 0;
@@ -871,17 +899,17 @@
{
memcpy(xmih.name, pIns->name, 22);
xmih.type = pIns->nMidiProgram;
- xmsh.volfade = min(pIns->nFadeOut, 0xFFF); // FFF is maximum in FT2
+ xmsh.volfade = LittleEndianW(min(pIns->nFadeOut, 0xFFF)); // FFF is maximum in FT2
xmsh.vnum = (BYTE)pIns->VolEnv.nNodes;
xmsh.pnum = (BYTE)pIns->PanEnv.nNodes;
if (xmsh.vnum > 12) xmsh.vnum = 12;
if (xmsh.pnum > 12) xmsh.pnum = 12;
for (UINT ienv=0; ienv<12; ienv++)
{
- xmsh.venv[ienv*2] = pIns->VolEnv.Ticks[ienv];
- xmsh.venv[ienv*2+1] = pIns->VolEnv.Values[ienv];
- xmsh.penv[ienv*2] = pIns->PanEnv.Ticks[ienv];
- xmsh.penv[ienv*2+1] = pIns->PanEnv.Values[ienv];
+ xmsh.venv[ienv*2] = LittleEndianW(pIns->VolEnv.Ticks[ienv]);
+ xmsh.venv[ienv*2+1] = LittleEndianW(pIns->VolEnv.Values[ienv]);
+ xmsh.penv[ienv*2] = LittleEndianW(pIns->PanEnv.Ticks[ienv]);
+ xmsh.penv[ienv*2+1] = LittleEndianW(pIns->PanEnv.Values[ienv]);
}
if (pIns->dwFlags & ENV_VOLUME) xmsh.vtype |= 1;
if (pIns->dwFlags & ENV_VOLSUSTAIN) xmsh.vtype |= 2;
@@ -914,15 +942,13 @@
if (xmih.samples >= 32) break;
xmsh.snum[j] = k; //record sample table offset in instrument's note map
}
-// xmsh.reserved2 = xmih.samples;
}
} else
{
xmih.samples = 1;
-// xmsh.reserved2 = 1;
smptable[0] = i;
}
- xmsh.shsize = (xmih.samples) ? 40 : 0;
+ xmsh.shsize = LittleEndianW((xmih.samples) ? 40 : 0);
fwrite(&xmih, 1, sizeof(xmih), f);
if (smptable[0])
{
@@ -932,9 +958,11 @@
xmsh.vibdepth = pvib->nVibDepth;
xmsh.vibrate = pvib->nVibRate;
}
- fwrite(&xmsh, 1, xmih.size - sizeof(xmih), f);
+ WORD samples = xmih.samples;
+ xmih.samples = LittleEndianW(xmih.samples);
+ fwrite(&xmsh, 1, sizeof(xmsh), f);
if (!xmih.samples) continue;
- for (UINT ins=0; ins<xmih.samples; ins++)
+ for (UINT ins = 0; ins < samples; ins++)
{
memset(&xmss, 0, sizeof(xmss));
if (smptable[ins]) memcpy(xmss.name, m_szNames[smptable[ins]], 22);
@@ -979,6 +1007,9 @@
xmss.pan = 255;
if (pSmp->nPan < 256) xmss.pan = (BYTE)pSmp->nPan;
xmss.relnote = (signed char)pSmp->RelativeTone;
+ xmss.samplen = LittleEndianW(xmss.samplen);
+ xmss.loopstart = LittleEndianW(xmss.loopstart);
+ xmss.looplen = LittleEndianW(xmss.looplen);
fwrite(&xmss, 1, xmsh.shsize, f);
}
for (UINT ismpd=0; ismpd<xmih.samples; ismpd++)
@@ -1050,7 +1081,7 @@
//Save hacked-on extra info
SaveMixPlugins(f);
- SaveExtendedInstrumentProperties(Instruments, header.instruments, f);
+ SaveExtendedInstrumentProperties(Instruments, xmheader.instruments, f);
SaveExtendedSongProperties(f);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <rel...@us...> - 2009-09-16 19:05:12
|
Revision: 366
http://modplug.svn.sourceforge.net/modplug/?rev=366&view=rev
Author: relabsoluness
Date: 2009-09-16 19:05:00 +0000 (Wed, 16 Sep 2009)
Log Message:
-----------
[New] MPTM: Can now have multiple sequences in a module (access from orderlist context menu).
[Fix] MPTM save/load: Loading extensions was broken in the case of not having any instruments.
[Ref] Internal: minor changes and cleanup.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/Ctrl_pat.h
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/Draw_pat.cpp
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/View_tre.cpp
trunk/OpenMPT/mptrack/View_tre.h
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/mptrack/serialization_utils.cpp
trunk/OpenMPT/mptrack/serialization_utils.h
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_psm.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
trunk/OpenMPT/soundlib/ModSequence.cpp
trunk/OpenMPT/soundlib/ModSequence.h
trunk/OpenMPT/soundlib/Snd_defs.h
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -66,6 +66,7 @@
ON_COMMAND(IDC_PATINSTROPLUGGUI2, ToggleSplitPluginEditor) //rewbs.instroVST
ON_EN_CHANGE(IDC_EDIT_SPACING, OnSpacingChanged)
ON_EN_CHANGE(IDC_EDIT_PATTERNNAME, OnPatternNameChanged)
+ ON_EN_CHANGE(IDC_EDIT_SEQUENCE_NAME, OnSequenceNameChanged)
ON_EN_KILLFOCUS(IDC_EDIT_ORDERLIST_MARGINS, OnOrderListMarginsChanged)
ON_UPDATE_COMMAND_UI(IDC_PATTERN_RECORD,OnUpdateRecord)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
@@ -278,6 +279,9 @@
m_OrderList.UpdateView(dwHintMask, pObj);
if (!m_pSndFile) return;
+ if (dwHintMask & HINT_MODSEQUENCE)
+ SetDlgItemText(IDC_EDIT_SEQUENCE_NAME, m_pSndFile->Order.m_sName);
+
//rewbs.instroVST
if (dwHintMask & (HINT_MIXPLUGINS|HINT_MODTYPE))
{
@@ -289,6 +293,10 @@
::EnableWindow(::GetDlgItem(m_hWnd, IDC_PATINSTROPLUGGUI2), true);
else
::EnableWindow(::GetDlgItem(m_hWnd, IDC_PATINSTROPLUGGUI2), false);
+
+ // Show/hide multisequence controls according the current modtype.
+ GetDlgItem(IDC_STATIC_SEQUENCE_NAME)->ShowWindow( (m_pSndFile->GetType() == MOD_TYPE_MPT) ? SW_SHOW : SW_HIDE);
+ GetDlgItem(IDC_EDIT_SEQUENCE_NAME)->ShowWindow( (m_pSndFile->GetType() == MOD_TYPE_MPT) ? SW_SHOW : SW_HIDE);
}
//end rewbs.instroVST
if (dwHintMask & HINT_MPTOPTIONS)
@@ -611,7 +619,7 @@
//Restore all save pattern state, except pattern number which we might have just set.
PATTERNVIEWSTATE* patternViewState = pFrame->GetPatternViewState();
- patternViewState->nPattern = SendViewMessage(VIEWMSG_GETCURRENTPATTERN);
+ patternViewState->nPattern = static_cast<PATTERNINDEX>(SendViewMessage(VIEWMSG_GETCURRENTPATTERN));
if (pFrame) SendViewMessage(VIEWMSG_LOADSTATE, (LPARAM)patternViewState);
SwitchToView();
@@ -919,7 +927,7 @@
nNewPat = pReplaceIndex[nCurPat]; // take care of patterns that have been duplicated before
else
nNewPat= pSndFile->Order[selection.nOrdLo + i];
- if (selection.nOrdLo + i + nInsertCount + 1 < pSndFile->Order.GetCount())
+ if (selection.nOrdLo + i + nInsertCount + 1 < pSndFile->Order.GetLength())
pSndFile->Order[selection.nOrdLo + i + nInsertCount + 1] = nNewPat;
}
}
@@ -927,7 +935,7 @@
{
m_OrderList.InvalidateRect(NULL, FALSE);
m_OrderList.SetCurSel(nInsertWhere);
- SetCurrentPattern(pSndFile->Order[min(nInsertWhere, pSndFile->Order.GetCount()-1)]);
+ SetCurrentPattern(pSndFile->Order[min(nInsertWhere, pSndFile->Order.GetLastIndex())]);
m_pModDoc->SetModified();
m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE|HINT_PATNAMES, this);
if(selection.nOrdHi != selection.nOrdLo) m_OrderList.m_nScrollPos2nd = nInsertWhere + nInsertCount;
@@ -1140,6 +1148,22 @@
}
+void CCtrlPatterns::OnSequenceNameChanged()
+//-----------------------------------------
+{
+ if (m_pSndFile)
+ {
+ CString str;
+ GetDlgItemText(IDC_EDIT_SEQUENCE_NAME, str);
+ if (str != m_pSndFile->Order.m_sName)
+ {
+ m_pSndFile->Order.m_sName = str;
+ m_pModDoc->SetModified();
+ }
+ }
+}
+
+
void CCtrlPatterns::OnSetupZxxMacros()
//------------------------------------
{
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-09-16 19:05:00 UTC (rev 366)
@@ -47,13 +47,15 @@
// make the current selection the secondary selection (used for keyboard orderlist navigation)
inline void SetCurSelTo2ndSel()
{if(m_bShift && m_nScrollPos2nd == ORDERINDEX_INVALID) m_nScrollPos2nd = m_nScrollPos; else if(!m_bShift && m_nScrollPos2nd != ORDERINDEX_INVALID) m_nScrollPos2nd = ORDERINDEX_INVALID;};
- bool SetCurSel(ORDERINDEX sel, bool bEdit = true, bool bShiftClick = false);
+ bool SetCurSel(ORDERINDEX sel, bool bEdit = true, bool bShiftClick = false, bool bIgnoreCurSel = false);
BOOL ProcessKeyDown(UINT nChar);
BOOL ProcessChar(UINT nChar);
BOOL UpdateScrollInfo();
void UpdateInfoText();
int GetFontWidth();
+ ORDERINDEX GetOrderFromPoint(const CRect& rect, const CPoint& pt) const;
+
// Sets target margin value and returns the effective margin value.
BYTE SetMargins(int);
@@ -113,6 +115,7 @@
afx_msg void OnPatternPaste();
afx_msg LRESULT OnDragonDropping(WPARAM bDoDrop, LPARAM lParam);
afx_msg LRESULT OnHelpHitTest(WPARAM, LPARAM lParam);
+ afx_msg void OnSelectSequence(UINT nid);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
@@ -218,6 +221,7 @@
afx_msg void OnNextInstrument();
afx_msg void OnSpacingChanged();
afx_msg void OnPatternNameChanged();
+ afx_msg void OnSequenceNameChanged();
afx_msg void OnOrderListMarginsChanged();
afx_msg void OnSetupZxxMacros();
afx_msg void OnChordEditor();
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -54,6 +54,7 @@
ON_COMMAND(ID_ORDERLIST_COPY, OnDuplicatePattern)
ON_COMMAND(ID_PATTERNCOPY, OnPatternCopy)
ON_COMMAND(ID_PATTERNPASTE, OnPatternPaste)
+ ON_COMMAND_RANGE(ID_SEQUENCE_ITEM, ID_SEQUENCE_ITEM + MAX_SEQUENCES + 1, OnSelectSequence)
ON_MESSAGE(WM_MOD_DRAGONDROPPING, OnDragonDropping)
ON_MESSAGE(WM_HELPHITTEST, OnHelpHitTest)
//}}AFX_MSG_MAP
@@ -87,6 +88,13 @@
}
+ORDERINDEX COrderList::GetOrderFromPoint(const CRect& rect, const CPoint& pt) const
+//---------------------------------------------------------------------------------
+{
+ return static_cast<ORDERINDEX>(m_nXScroll + (pt.x - rect.left) / m_cxFont);
+}
+
+
BOOL COrderList::Init(const CRect &rect, CCtrlPatterns *pParent, CModDoc *pModDoc, HFONT hFont)
//---------------------------------------------------------------------------------------------
{
@@ -216,18 +224,20 @@
else
result.nOrdHi = m_nScrollPos2nd;
}
+ LimitMax(result.nOrdLo, m_pModDoc->GetSoundFile()->Order.GetLastIndex());
+ LimitMax(result.nOrdHi, m_pModDoc->GetSoundFile()->Order.GetLastIndex());
return result;
}
-bool COrderList::SetCurSel(ORDERINDEX sel, bool bEdit, bool bShiftClick)
-//----------------------------------------------------------------------
+bool COrderList::SetCurSel(ORDERINDEX sel, bool bEdit, bool bShiftClick, bool bIgnoreCurSel)
+//------------------------------------------------------------------------------------------
{
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
ORDERINDEX *nOrder = (bShiftClick) ? &m_nScrollPos2nd : &m_nScrollPos;
- if ((sel < 0) || (sel >= int(pSndFile->Order.size())) || (!m_pParent) || (!pMainFrm)) return false;
- if (sel == *nOrder) return true;
+ if ((sel < 0) || (sel >= pSndFile->Order.GetLength()) || (!m_pParent) || (!pMainFrm)) return false;
+ if (!bIgnoreCurSel && sel == *nOrder) return true;
const BYTE nShownLength = GetLength();
InvalidateSelection();
*nOrder = sel;
@@ -281,7 +291,7 @@
END_CRITICAL();
}
m_pParent->SetCurrentPattern(n);
- m_pModDoc->SetElapsedTime(static_cast<ORDERINDEX>(m_nScrollPos), 0);
+ m_pModDoc->SetElapsedTime(m_nScrollPos, 0);
}
}
UpdateInfoText();
@@ -294,7 +304,7 @@
//----------------------------------------
{
CSoundFile* pSndFile = m_pModDoc ? m_pModDoc->GetSoundFile() : NULL;
- if ((pSndFile) && (m_nScrollPos < pSndFile->Patterns.Size()))
+ if ((pSndFile) && (m_nScrollPos < pSndFile->Order.GetLength()))
{
return pSndFile->Order[m_nScrollPos];
}
@@ -316,11 +326,11 @@
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- ORDERINDEX i = 0;
- const int nSeqLength = pSndFile->Order.size();
- for (i=0; i+1 < nSeqLength; i++) if (pSndFile->Order[i+1] == pSndFile->Order.GetInvalidPatIndex()) break;
+ ORDERINDEX nLast = pSndFile->Order.GetLengthFirstEmpty();
+ if (nLast)
+ nLast--;
SetCurSelTo2ndSel();
- SetCurSel(i);
+ SetCurSel(nLast);
}
break;
case VK_DELETE: OnDeleteOrder(); break;
@@ -484,7 +494,7 @@
m_nScrollPos, pSndFile->GetNumPatterns(), m_nScrollPos, pSndFile->GetNumPatterns());
}
- if (m_nScrollPos < int(pSndFile->Order.size()))
+ if (m_nScrollPos < pSndFile->Order.GetLength())
{
UINT nPat = pSndFile->Order[m_nScrollPos];
if ((nPat < pSndFile->Patterns.Size()) && (nPat < pSndFile->m_nPatternNames))
@@ -535,7 +545,7 @@
while (rect.left < rcClient.right)
{
bool bHighLight = ((bFocus) && (nIndex >= selection.nOrdLo && nIndex <= selection.nOrdHi)) ? true : false;
- ORDERINDEX nOrder = ((nIndex >= 0) && (nIndex < int(pSndFile->Order.size()))) ? pSndFile->Order[nIndex] : -1;
+ const PATTERNINDEX nPat = ((nIndex >= 0) && (nIndex < pSndFile->Order.GetLength())) ? pSndFile->Order[nIndex] : PATTERNINDEX_INVALID;
if ((rect.right = rect.left + m_cxFont) > rcClient.right) rect.right = rcClient.right;
rect.right--;
if (bHighLight) {
@@ -546,7 +556,7 @@
//Drawing the shown pattern-indicator or drag position.
- if (nIndex == ((m_bDragging) ? (int)m_nDropPos : m_nScrollPos))
+ if (nIndex == ((m_bDragging) ? m_nDropPos : m_nScrollPos))
{
rect.InflateRect(-1, -1);
dc.DrawFocusRect(&rect);
@@ -555,7 +565,7 @@
MoveToEx(dc.m_hDC, rect.right, rect.top, NULL);
LineTo(dc.m_hDC, rect.right, rect.bottom);
//Drawing the 'ctrl-transition' indicator
- if (nIndex == (int)pSndFile->m_nSeqOverride-1)
+ if (nIndex == pSndFile->m_nSeqOverride-1)
{
MoveToEx(dc.m_hDC, rect.left+4, rect.bottom-4, NULL);
LineTo(dc.m_hDC, rect.right-4, rect.bottom-4);
@@ -564,21 +574,18 @@
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
//Drawing 'playing'-indicator.
- if(nIndex == (int)pSndFile->GetCurrentOrder() && pMainFrm->IsPlaying() )
+ if(nIndex == pSndFile->GetCurrentOrder() && pMainFrm->IsPlaying() )
{
MoveToEx(dc.m_hDC, rect.left+4, rect.top+2, NULL);
LineTo(dc.m_hDC, rect.right-4, rect.top+2);
}
s[0] = 0;
- if ((nOrder >= 0) && (rect.left + m_cxFont - 4 <= rcClient.right))
+ if ((nIndex < pSndFile->Order.GetLength()) && (rect.left + m_cxFont - 4 <= rcClient.right))
{
- if (nIndex < pSndFile->Order.GetCount())
- {
- if (nOrder == pSndFile->Order.GetInvalidPatIndex()) strcpy(s, "---");
- else if (nOrder == pSndFile->Order.GetIgnoreIndex()) strcpy(s, "+++");
- else if (nOrder < pSndFile->Patterns.Size()) wsprintf(s, "%d", nOrder);
- else strcpy(s, "???");
- }
+ if (nPat == pSndFile->Order.GetInvalidPatIndex()) strcpy(s, "---");
+ else if (nPat == pSndFile->Order.GetIgnoreIndex()) strcpy(s, "+++");
+ else if (nPat < pSndFile->Patterns.Size()) wsprintf(s, "%u", nPat);
+ else strcpy(s, "???");
}
dc.SetTextColor((bHighLight) ? colorTextSel : colorText);
dc.DrawText(s, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
@@ -626,8 +633,8 @@
if (m_pModDoc)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- ORDERINDEX nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont;
- if ((nOrder >= 0) && (nOrder < int(pSndFile->Order.size())))
+ ORDERINDEX nOrder = GetOrderFromPoint(rect, pt);
+ if ((nOrder >= 0) && (nOrder < pSndFile->Order.GetLength()))
{
if (pSndFile->m_nSeqOverride == static_cast<UINT>(nOrder)+1) {
pSndFile->m_nSeqOverride=0;
@@ -642,7 +649,7 @@
// mark pattern (+skip to)
const int oldXScroll = m_nXScroll;
- ORDERINDEX nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont;
+ ORDERINDEX nOrder = GetOrderFromPoint(rect, pt);
ORD_SELECTION selection = GetCurSel(false);
// check if cursor is in selection - if it is, only react on MouseUp as the user might want to drag those orders
@@ -678,7 +685,7 @@
ReleaseCapture();
if (rect.PtInRect(pt))
{
- int n = m_nXScroll + (pt.x - rect.left) / m_cxFont;
+ ORDERINDEX n = GetOrderFromPoint(rect, pt);
if ((n >= 0) && (n == m_nDropPos) && (m_pModDoc))
{
// drag multiple orders (not quite as easy...)
@@ -719,7 +726,7 @@
}
else
{
- ORDERINDEX nOrder = m_nXScroll + (pt.x - rect.left) / m_cxFont;
+ ORDERINDEX nOrder = GetOrderFromPoint(rect, pt);
ORD_SELECTION selection = GetCurSel(false);
// this should actually have equal signs but that breaks multiselect: nOrder >= selection.nOrdLo && nOrder <= section.nOrdHi
@@ -728,7 +735,7 @@
// Remove selection if we didn't drag anything but multiselect was active
m_nScrollPos2nd = ORDERINDEX_INVALID;
SetFocus();
- SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont);
+ SetCurSel(GetOrderFromPoint(rect, pt));
}
}
}
@@ -752,8 +759,8 @@
if (rect.PtInRect(pt))
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- n = m_nXScroll + (pt.x - rect.left) / m_cxFont;
- if (n >= int(pSndFile->Order.size()) || n >= pSndFile->GetModSpecifications().ordersMax) n = ORDERINDEX_INVALID;
+ n = GetOrderFromPoint(rect, pt);
+ if (n >= pSndFile->Order.GetLength() || n >= pSndFile->GetModSpecifications().ordersMax) n = ORDERINDEX_INVALID;
}
if (n != (int)m_nDropPos)
{
@@ -775,6 +782,43 @@
}
+void COrderList::OnSelectSequence(UINT nid)
+//-----------------------------------------
+{
+ BEGIN_CRITICAL();
+ CMainFrame::GetMainFrame()->ResetNotificationBuffer();
+ const SEQUENCEINDEX nId = static_cast<SEQUENCEINDEX>(nid - ID_SEQUENCE_ITEM);
+ CSoundFile& rSf = *m_pModDoc->GetSoundFile();
+ if (nId == MAX_SEQUENCES + 1)
+ {
+ CString strParam; strParam.Format(TEXT("%u: %s"), rSf.Order.GetCurrentSequenceIndex(), rSf.Order.m_sName);
+ CString str;
+ AfxFormatString1(str, IDS_CONFIRM_SEQUENCE_DELETE, strParam);
+ if (AfxMessageBox(str, MB_YESNO | MB_ICONQUESTION) == IDYES)
+ rSf.Order.RemoveSequence();
+ else
+ {
+ END_CRITICAL();
+ return;
+ }
+ }
+ else if (nId == MAX_SEQUENCES)
+ rSf.Order.AddSequence();
+ else if (nId < rSf.Order.GetNumSequences())
+ rSf.Order.SetSequence(nId);
+ ORDERINDEX nPosCandidate = rSf.Order.GetLengthTailTrimmed() - 1;
+ SetCurSel(min(m_nScrollPos, nPosCandidate), true, false, true);
+ if (m_pParent)
+ m_pParent->SetCurrentPattern(rSf.Order[m_nScrollPos]);
+
+ UpdateScrollInfo();
+ END_CRITICAL();
+ UpdateView(HINT_MODSEQUENCE);
+ m_pModDoc->SetModified();
+ m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this);
+}
+
+
void COrderList::OnRButtonDown(UINT nFlags, CPoint pt)
//----------------------------------------------------
{
@@ -791,7 +835,7 @@
bool bMultiSelection = (m_nScrollPos2nd != ORDERINDEX_INVALID);
- if(!bMultiSelection) SetCurSel(m_nXScroll + (pt.x - rect.left) / m_cxFont);
+ if(!bMultiSelection) SetCurSel(GetOrderFromPoint(rect, pt));
SetFocus();
HMENU hMenu = ::CreatePopupMenu();
if(!hMenu) return;
@@ -826,11 +870,31 @@
AppendMenu(hMenu, MF_STRING | greyed, ID_ORDERLIST_COPY, "&Duplicate Pattern");
AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERNCOPY, "&Copy Pattern");
AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERNPASTE, "P&aste Pattern");
- if ((m_pModDoc) && (m_pModDoc->GetSoundFile()->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)))
+ if (pSndFile->TypeIsIT_MPT_XM())
{
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
- AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERN_PROPERTIES, "&Properties...");
+ AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERN_PROPERTIES, "&Pattern properties...");
}
+ if (pSndFile->GetType() == MOD_TYPE_MPT)
+ {
+ AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
+
+ HMENU menuSequence = ::CreatePopupMenu();
+ AppendMenu(hMenu, MF_POPUP, (UINT_PTR)menuSequence, TEXT("Sequences"));
+
+ const SEQUENCEINDEX numSequences = pSndFile->Order.GetNumSequences();
+ for(SEQUENCEINDEX i = 0; i < numSequences; i++)
+ {
+ CString str;
+ str.Format(TEXT("%u: %s"), i, (LPCTSTR)pSndFile->Order.GetSequence(i).m_sName);
+ const UINT flags = (pSndFile->Order.GetCurrentSequenceIndex() == i) ? MF_STRING|MF_CHECKED : MF_STRING;
+ AppendMenu(menuSequence, flags, ID_SEQUENCE_ITEM + i, str);
+ }
+ if (pSndFile->Order.GetNumSequences() < MAX_SEQUENCES)
+ AppendMenu(menuSequence, MF_STRING, ID_SEQUENCE_ITEM + MAX_SEQUENCES, TEXT("Create new sequence"));
+ if (pSndFile->Order.GetNumSequences() > 1)
+ AppendMenu(menuSequence, MF_STRING, ID_SEQUENCE_ITEM + MAX_SEQUENCES + 1, TEXT("Delete current sequence"));
+ }
}
AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_RENDER, "Render to &Wave");
@@ -857,7 +921,7 @@
void COrderList::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar*)
//--------------------------------------------------------------
{
- ORDERINDEX nNewPos = m_nXScroll;
+ UINT nNewPos = m_nXScroll;
UINT smin, smax;
GetScrollRange(SB_HORZ, (LPINT)&smin, (LPINT)&smax);
@@ -874,9 +938,9 @@
case SB_ENDSCROLL: m_bScrolling = false; break;
}
if (nNewPos > smax) nNewPos = smax;
- if (nNewPos != (UINT)m_nXScroll)
+ if (nNewPos != m_nXScroll)
{
- m_nXScroll = nNewPos;
+ m_nXScroll = static_cast<ORDERINDEX>(nNewPos);
SetScrollPos(SB_HORZ, m_nXScroll);
InvalidateRect(NULL, FALSE);
}
@@ -886,17 +950,17 @@
void COrderList::OnSize(UINT nType, int cx, int cy)
//-------------------------------------------------
{
- ORDERINDEX nPos;
+ int nPos;
int smin, smax;
CWnd::OnSize(nType, cx, cy);
UpdateScrollInfo();
GetScrollRange(SB_HORZ, &smin, &smax);
- nPos = (ORDERINDEX)GetScrollPos(SB_HORZ);
+ nPos = GetScrollPos(SB_HORZ);
if (nPos > smax) nPos = smax;
if (m_nXScroll != nPos)
{
- m_nXScroll = nPos;
+ m_nXScroll = static_cast<ORDERINDEX>(nPos);
SetScrollPos(SB_HORZ, m_nXScroll);
InvalidateRect(NULL, FALSE);
}
@@ -916,25 +980,26 @@
for(ORDERINDEX i = 0; i <= nInsertCount; i++)
{
-
//Checking whether there is some pattern at the end of orderlist.
- if(pSndFile->Order[pSndFile->Order.size() - 1] < pSndFile->Patterns.Size())
+ if (pSndFile->Order.GetLength() < 1 || pSndFile->Order.Last() < pSndFile->Patterns.Size())
{
- if(pSndFile->Order.size() < pSndFile->GetModSpecifications().ordersMax)
- pSndFile->Order.push_back(pSndFile->Order.GetInvalidPatIndex());
+ if(pSndFile->Order.GetLength() < pSndFile->GetModSpecifications().ordersMax)
+ pSndFile->Order.Append();
}
-
- for(int j = pSndFile->Order.size() - 1; j > nInsertEnd; j--) pSndFile->Order[j] = pSndFile->Order[j - 1];
+ for(int j = pSndFile->Order.GetLastIndex(); j > nInsertEnd; j--)
+ pSndFile->Order[j] = pSndFile->Order[j - 1];
}
// now that there is enough space in the order list, overwrite the orders
for(ORDERINDEX i = 0; i <= nInsertCount; i++)
{
- if(nInsertEnd + i + 1 < pSndFile->GetModSpecifications().ordersMax)
+ if(nInsertEnd + i + 1 < pSndFile->GetModSpecifications().ordersMax
+ &&
+ nInsertEnd + i + 1 < pSndFile->Order.GetLength())
pSndFile->Order[nInsertEnd + i + 1] = pSndFile->Order[nInsertEnd - nInsertCount + i];
}
- m_nScrollPos = min(nInsertEnd + 1, pSndFile->Order.GetCount() - 1);
+ m_nScrollPos = min(nInsertEnd + 1, pSndFile->Order.GetLastIndex());
if(nInsertCount > 0)
- m_nScrollPos2nd = min(m_nScrollPos + nInsertCount, pSndFile->Order.GetCount() - 1);
+ m_nScrollPos2nd = min(m_nScrollPos + nInsertCount, pSndFile->Order.GetLastIndex());
else
m_nScrollPos2nd = ORDERINDEX_INVALID;
InvalidateRect(NULL, FALSE);
@@ -1053,7 +1118,7 @@
//-----------------------------------------------------------------
{
LPDRAGONDROP pDropInfo = (LPDRAGONDROP)lParam;
- UINT posdest;
+ ORDERINDEX posdest;
BOOL bCanDrop;
CSoundFile *pSndFile;
CPoint pt;
@@ -1073,8 +1138,8 @@
GetCursorPos(&pt);
ScreenToClient(&pt);
if (pt.x < 0) pt.x = 0;
- posdest = m_nXScroll + (pt.x / m_cxFont);
- if (posdest >= pSndFile->Order.size()) return FALSE;
+ posdest = static_cast<ORDERINDEX>(m_nXScroll + (pt.x / m_cxFont));
+ if (posdest >= pSndFile->Order.GetLength()) return FALSE;
switch(pDropInfo->dwDropType)
{
case DRAGONDROP_PATTERN:
Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -620,7 +620,7 @@
ORDERINDEX nNextOrder;
nNextOrder = pSndFile->Order.GetNextOrderIgnoringSkips(startOrder);
//Ignore skip items(+++) from sequence.
- const ORDERINDEX ordCount = pSndFile->Order.GetCount();
+ const ORDERINDEX ordCount = pSndFile->Order.GetLength();
if ((nNextOrder < ordCount) && (pSndFile->Order[startOrder] == m_nPattern))
{
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -2977,7 +2977,7 @@
//ensure order correlates with pattern.
if (pSndFile->Order[ord]!=pat) {
ORDERINDEX tentativeOrder = pSndFile->FindOrder(pat);
- if (tentativeOrder != -1) { //ensure a valid order exists.
+ if (tentativeOrder != ORDERINDEX_INVALID) { //ensure a valid order exists.
ord = tentativeOrder;
}
}
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -940,6 +940,12 @@
BOOL CModDoc::RemoveUnusedPatterns(BOOL bRemove)
//----------------------------------------------
{
+ if (GetSoundFile()->GetType() == MOD_TYPE_MPT && GetSoundFile()->Order.GetNumSequences() > 1)
+ { // Multiple sequences are not taken into account in the code below. For now just make
+ // removing unused patterns disabled in this case.
+ AfxMessageBox(IDS_PATTERN_CLEANUP_UNAVAILABLE, MB_ICONINFORMATION);
+ return FALSE;
+ }
const UINT maxPatIndex = m_SndFile.Patterns.Size();
const UINT maxOrdIndex = m_SndFile.Order.size();
vector<UINT> nPatMap(maxPatIndex, 0);
@@ -1668,10 +1674,10 @@
//Increasing orderlist size if given order is beyond current limit,
//or if the last order already has a pattern.
if((nOrd == m_SndFile.Order.size() ||
- m_SndFile.Order.back() < m_SndFile.Patterns.Size() ) &&
- m_SndFile.Order.size() < m_SndFile.GetModSpecifications().ordersMax)
+ m_SndFile.Order.Last() < m_SndFile.Patterns.Size() ) &&
+ m_SndFile.Order.GetLength() < m_SndFile.GetModSpecifications().ordersMax)
{
- m_SndFile.Order.push_back(m_SndFile.Order.GetInvalidPatIndex());
+ m_SndFile.Order.Append();
}
for (UINT j=0; j<m_SndFile.Order.size(); j++)
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -2853,9 +2853,6 @@
}
-
-
-
LRESULT CViewPattern::OnPlayerNotify(MPTNOTIFICATION *pnotify)
//------------------------------------------------------------
{
@@ -2897,7 +2894,7 @@
}
*/
- if (pSndFile->Order[nOrd] != nPat) {
+ if (nOrd >= pSndFile->Order.GetLength() || pSndFile->Order[nOrd] != nPat) {
//order doesn't correlate with pattern, so mark it as invalid
nOrd = 0xFFFF;
}
Modified: trunk/OpenMPT/mptrack/View_tre.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -688,8 +688,12 @@
if ((pInfo->hOrders) && (hintFlagPart != HINT_INSNAMES) && (hintFlagPart != HINT_SMPNAMES))
{
const DWORD nPat = (lHint >> HINT_SHIFT_PAT);
- pInfo->tiOrders.resize(pSndFile->Order.size(), NULL);
- UINT imin=0, imax=pSndFile->Order.size()-1;
+ // If there are items past the new sequence length, delete them.
+ for(size_t i = pSndFile->Order.GetLength(); i < pInfo->tiOrders.size(); i++) if (pInfo->tiOrders[i])
+ {DeleteItem(pInfo->tiOrders[i]); pInfo->tiOrders[i] = NULL;}
+ if (pInfo->tiOrders.size() < pSndFile->Order.GetLength()) // Resize tiOrders if needed.
+ pInfo->tiOrders.resize(pSndFile->Order.GetLength(), NULL);
+ UINT imin=0, imax = pSndFile->Order.GetLastIndex();
const bool patNamesOnly = (hintFlagPart == HINT_PATNAMES);
//if (hintFlagPart == HINT_PATNAMES) && (dwHintParam < pSndFile->Order.size())) imin = imax = dwHintParam;
BOOL bEnded = FALSE;
@@ -1260,53 +1264,53 @@
//--------------------------------------------
{
DWORD dwItemType = GetModItem(hItem);
- DWORD dwItem = dwItemType >> 16;
+ WORD nItem = WORD(dwItemType >> 16);
PMODTREEDOCINFO pInfo = DocInfo[m_nDocNdx];
CModDoc *pModDoc = (pInfo) ? pInfo->pModDoc : NULL;
switch(dwItemType & 0xFFFF)
{
case MODITEM_ORDER:
- if ((pModDoc) && (pModDoc->RemoveOrder(dwItem)))
+ if ((pModDoc) && (pModDoc->RemoveOrder(nItem)))
{
pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL);
}
break;
case MODITEM_PATTERN:
- if ((pModDoc) && (pModDoc->RemovePattern(dwItem)))
+ if ((pModDoc) && (pModDoc->RemovePattern(nItem)))
{
//pModDoc->UpdateAllViews(NULL, (dwItem << 16)|HINT_PATTERNDATA|HINT_PATNAMES);
- pModDoc->UpdateAllViews(NULL, (dwItem << HINT_SHIFT_PAT) | HINT_PATTERNDATA|HINT_PATNAMES);
+ pModDoc->UpdateAllViews(NULL, (UINT(nItem) << HINT_SHIFT_PAT) | HINT_PATTERNDATA|HINT_PATNAMES);
}
break;
case MODITEM_SAMPLE:
- if ((pModDoc) && (pModDoc->RemoveSample(dwItem)))
+ if ((pModDoc) && (pModDoc->RemoveSample(nItem)))
{
//pModDoc->UpdateAllViews(NULL, (dwItem << 16) | HINT_SMPNAMES|HINT_SAMPLEDATA|HINT_SAMPLEINFO);
- pModDoc->UpdateAllViews(NULL, (dwItem << HINT_SHIFT_SMP) | HINT_SMPNAMES|HINT_SAMPLEDATA|HINT_SAMPLEINFO);
+ pModDoc->UpdateAllViews(NULL, (UINT(nItem) << HINT_SHIFT_SMP) | HINT_SMPNAMES|HINT_SAMPLEDATA|HINT_SAMPLEINFO);
}
break;
case MODITEM_INSTRUMENT:
- if ((pModDoc) && (pModDoc->RemoveInstrument(dwItem)))
+ if ((pModDoc) && (pModDoc->RemoveInstrument(nItem)))
{
//pModDoc->UpdateAllViews(NULL, (dwItem << 16)|HINT_MODTYPE|HINT_ENVELOPE|HINT_INSTRUMENT);
- pModDoc->UpdateAllViews(NULL, (dwItem << HINT_SHIFT_INS) | HINT_MODTYPE|HINT_ENVELOPE|HINT_INSTRUMENT);
+ pModDoc->UpdateAllViews(NULL, (UINT(nItem) << HINT_SHIFT_INS) | HINT_MODTYPE|HINT_ENVELOPE|HINT_INSTRUMENT);
}
break;
case MODITEM_MIDIINSTRUMENT:
- SetMidiInstrument(dwItem, "");
+ SetMidiInstrument(nItem, "");
RefreshMidiLibrary();
break;
case MODITEM_MIDIPERCUSSION:
- SetMidiPercussion(dwItem, "");
+ SetMidiPercussion(nItem, "");
RefreshMidiLibrary();
break;
case MODITEM_DLSBANK_FOLDER:
- CTrackApp::RemoveDLSBank(dwItem);
+ CTrackApp::RemoveDLSBank(nItem);
RefreshDlsBanks();
break;
@@ -2147,7 +2151,7 @@
if (pSndFile) {
PSNDMIXPLUGIN pPlugin = &pSndFile->m_MixPlugins[dwItemNo];
if (pPlugin) {
- bool bypassed = pPlugin->Info.dwInputRouting&MIXPLUG_INPUTF_BYPASS;
+ bool bypassed = ((pPlugin->Info.dwInputRouting&MIXPLUG_INPUTF_BYPASS) != 0);
AppendMenu(hMenu, (bypassed?MF_CHECKED:0)|MF_STRING, ID_MODTREE_MUTE, "&Bypass");
}
}
Modified: trunk/OpenMPT/mptrack/View_tre.h
===================================================================
--- trunk/OpenMPT/mptrack/View_tre.h 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/View_tre.h 2009-09-16 19:05:00 UTC (rev 366)
@@ -61,7 +61,7 @@
if(pSndFile != NULL)
{
tiPatterns.resize(pSndFile->Patterns.Size(), NULL);
- tiOrders.resize(pSndFile->Order.size(), NULL);
+ tiOrders.resize(pSndFile->Order.GetLength(), NULL);
}
memset(tiSamples, 0, sizeof(tiSamples));
memset(tiInstruments, 0, sizeof(tiInstruments));
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2009-09-16 19:05:00 UTC (rev 366)
@@ -358,8 +358,8 @@
CONTROL "Follow Song",IDC_PATTERN_FOLLOWSONG,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT,432,34,55,10
COMBOBOX IDC_COMBO_INSTRUMENT,22,74,95,137,CBS_DROPDOWNLIST | WS_VSCROLL
CTEXT "Row spacing",IDC_STATIC,172,32,54,12,SS_CENTERIMAGE,WS_EX_STATICEDGE
- EDITTEXT IDC_EDIT_SPACING,225,32,40,12,ES_AUTOHSCROLL | ES_NUMBER | NOT WS_TABSTOP
- CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,256,33,9,11
+ EDITTEXT IDC_EDIT_SPACING,225,32,28,12,ES_AUTOHSCROLL | ES_NUMBER | NOT WS_TABSTOP
+ CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,245,32,11,11
PUSHBUTTON "<<",IDC_BUTTON2,2,99,14,15,NOT WS_TABSTOP,WS_EX_STATICEDGE
PUSHBUTTON ">>",IDC_BUTTON1,14,99,14,15,NOT WS_TABSTOP,WS_EX_STATICEDGE
CTEXT "Pattern name",IDC_STATIC,9,32,52,12,SS_CENTERIMAGE,WS_EX_STATICEDGE
@@ -380,9 +380,11 @@
GROUPBOX "Keyboard Split",IDC_STATIC,167,53,328,40
LTEXT "Octave shift",IDC_STATIC,382,65,52,8
GROUPBOX "",IDC_STATIC,2,22,493,27
- CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT | WS_TABSTOP,355,34,57,10
+ CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT | WS_TABSTOP,370,34,55,10
EDITTEXT IDC_EDIT_ORDERLIST_MARGINS,2,113,28,12,ES_AUTOHSCROLL | ES_READONLY
CONTROL "",IDC_SPIN_ORDERLIST_MARGINS,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,15,118,11,11
+ EDITTEXT IDC_EDIT_SEQUENCE_NAME,317,32,47,12,ES_AUTOHSCROLL
+ CTEXT "Sequence name",IDC_STATIC_SEQUENCE_NAME,261,32,55,12,SS_CENTERIMAGE,WS_EX_STATICEDGE
END
IDD_CONTROL_SAMPLES DIALOGEX 0, 0, 544, 106
@@ -2211,6 +2213,9 @@
IDS_UNABLE_TO_LOAD_KEYBINDINGS
"Loading keybindings failed. The keyboard won't work properly."
IDS_CANT_OPEN_FILE_FOR_WRITING "Can't open file for writing."
+ IDS_CONFIRM_SEQUENCE_DELETE "Delete sequence %1?"
+ IDS_PATTERN_CLEANUP_UNAVAILABLE
+ "Removing unused patterns is not available when using multiple sequences."
END
#endif // English (U.S.) resources
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/resource.h 2009-09-16 19:05:00 UTC (rev 366)
@@ -50,6 +50,8 @@
#define IDS_CANT_OPEN_KEYBINDING_FILE 211
#define IDS_UNABLE_TO_LOAD_KEYBINDINGS 212
#define IDS_CANT_OPEN_FILE_FOR_WRITING 213
+#define IDS_CONFIRM_SEQUENCE_DELETE 214
+#define IDS_PATTERN_CLEANUP_UNAVAILABLE 215
#define IDB_MAINBAR 300
#define IDB_IMAGELIST 301
#define IDB_PATTERNS 302
@@ -885,6 +887,8 @@
#define IDC_CHECK_PATRECORD 2386
#define IDC_LOAD_COLORSCHEME 2387
#define IDC_SAVE_COLORSCHEME 2388
+#define IDC_EDIT_SEQUENCE_NAME 2389
+#define IDC_STATIC_SEQUENCE_NAME 2390
#define ID_FILE_NEWMOD 32771
#define ID_FILE_NEWXM 32772
#define ID_FILE_NEWS3M 32773
@@ -1078,6 +1082,7 @@
#define ID_CLEAR_SELECTION 38000
#define ID_PLUG_PASSKEYS 38001
#define ID_VIEW_SONGPROPERTIES 38002
+#define ID_SEQUENCE_ITEM 38003
#define ID_GROW_SELECTION 40001
#define ID_SHRINK_SELECTION 40002
#define ID_RUN_SCRIPT 40003
@@ -1127,7 +1132,7 @@
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 521
#define _APS_NEXT_COMMAND_VALUE 59230
-#define _APS_NEXT_CONTROL_VALUE 2389
+#define _APS_NEXT_CONTROL_VALUE 2391
#define _APS_NEXT_SYMED_VALUE 901
#endif
#endif
Modified: trunk/OpenMPT/mptrack/serialization_utils.cpp
===================================================================
--- trunk/OpenMPT/mptrack/serialization_utils.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/serialization_utils.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -131,15 +131,15 @@
}
-void WriteItemString(OutStream& oStrm, const std::string& str)
-//------------------------------------------------------------
+void WriteItemString(OutStream& oStrm, const char* const pStr, const size_t nSize)
+//--------------------------------------------------------------------------------
{
- uint32 id = (std::min)(str.size(), (uint32_max >> 4)) << 4;
+ uint32 id = (std::min)(nSize, (uint32_max >> 4)) << 4;
id |= 12; // 12 == 1100b
Binarywrite<uint32>(oStrm, id);
id >>= 4;
if(id > 0)
- oStrm.write(str.c_str(), id);
+ oStrm.write(pStr, id);
}
Modified: trunk/OpenMPT/mptrack/serialization_utils.h
===================================================================
--- trunk/OpenMPT/mptrack/serialization_utils.h 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/mptrack/serialization_utils.h 2009-09-16 19:05:00 UTC (rev 366)
@@ -344,11 +344,13 @@
Binarywrite(oStrm, data);
}
-void WriteItemString(OutStream& oStrm, const std::string& str);
+void WriteItemString(OutStream& oStrm, const char* const pStr, const size_t nSize);
template <>
-inline void WriteItem<std::string>(OutStream& oStrm, const std::string& str) {WriteItemString(oStrm, str);}
+inline void WriteItem<std::string>(OutStream& oStrm, const std::string& str) {WriteItemString(oStrm, str.c_str(), str.length());}
+template <>
+inline void WriteItem<LPCSTR>(OutStream& oStrm, const LPCSTR& psz) {WriteItemString(oStrm, psz, strlen(psz));}
template<class T>
inline void Binaryread(InStream& iStrm, T& data)
@@ -416,6 +418,25 @@
ReadItemString(iStrm, str, nSize);
}
+
+template <class T>
+struct ArrayWriter
+//================
+{
+ ArrayWriter(size_t nCount) : m_nCount(nCount) {}
+ void operator()(srlztn::OutStream& oStrm, const T* pData) {oStrm.write(reinterpret_cast<const char*>(pData), m_nCount * sizeof(T));}
+ size_t m_nCount;
+};
+
+template <class T>
+struct ArrayReader
+//================
+{
+ ArrayReader(size_t nCount) : m_nCount(nCount) {}
+ void operator()(srlztn::InStream& iStrm, T* pData, const size_t) {iStrm.read(reinterpret_cast<char*>(pData), m_nCount * sizeof(T));}
+ size_t m_nCount;
+};
+
} //namespace srlztn.
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -1004,8 +1004,8 @@
Order.ReadAsByte(lpStream + dwMemPos, nordsize, dwMemLength - dwMemPos);
dwMemPos += pifh->ordnum;
//Replacing 0xFF and 0xFE with new corresponding indexes
- replace(Order.begin(), Order.end(), static_cast<PATTERNINDEX>(0xFE), Order.GetIgnoreIndex());
- replace(Order.begin(), Order.end(), static_cast<PATTERNINDEX>(0xFF), Order.GetInvalidPatIndex());
+ Order.Replace(0xFE, Order.GetIgnoreIndex());
+ Order.Replace(0xFF, Order.GetInvalidPatIndex());
}
}
@@ -1493,8 +1493,9 @@
ssb.BeginRead("mptm", 1);
ssb.ReadItem(GetTuneSpecificTunings(), "0", 1, &ReadTuningCollection);
ssb.ReadItem(*this, "1", 1, &ReadTuningMap);
- ssb.ReadItem(Order, "2", 1, &ReadModSequence);
+ ssb.ReadItem(Order, "2", 1, &ReadModSequenceOld);
ssb.ReadItem(Patterns, FileIdPatterns, strlen(FileIdPatterns), &ReadModPatterns);
+ ssb.ReadItem(Order, FileIdSequences, strlen(FileIdSequences), &ReadModSequences);
if (ssb.m_Status & srlztn::SNT_FAILURE)
AfxMessageBox("Unknown error occured.", MB_ICONERROR);
@@ -2421,9 +2422,10 @@
if (AreNonDefaultTuningsUsed(*this))
ssb.WriteItem(*this, "1", 1, &WriteTuningMap);
if (Order.NeedsExtraDatafield())
- ssb.WriteItem(Order, "2", 1, &WriteModSequence);
+ ssb.WriteItem(Order, "2", 1, &WriteModSequenceOld);
if (bNeedsMptPatSave)
ssb.WriteItem(Patterns, FileIdPatterns, strlen(FileIdPatterns), &WriteModPatterns);
+ ssb.WriteItem(Order, FileIdSequences, strlen(FileIdSequences), &WriteModSequences);
ssb.FinishWrite();
@@ -3463,6 +3465,9 @@
code = 'MPTX'; // write extension header code
fwrite(&code, 1, sizeof(__int32), f);
+
+ if (nInstruments == 0)
+ return;
WriteInstrumentPropertyForAllInstruments('VR..', sizeof(m_defaultInstrument.nVolRamp), f, instruments, nInstruments);
WriteInstrumentPropertyForAllInstruments('MiP.', sizeof(m_defaultInstrument.nMixPlug), f, instruments, nInstruments);
Modified: trunk/OpenMPT/soundlib/Load_psm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -259,7 +259,7 @@
// every pattern in the order will be unique, so store the pointer + pattern ID
orderOffsets.push_back(patternOffsets[i]);
- Order.push_back(numPatterns);
+ Order.Append(numPatterns);
numPatterns++;
break;
}
@@ -359,7 +359,7 @@
}
// separate subsongs by "---" patterns
orderOffsets.push_back(nullptr);
- Order.push_back(Order.GetInvalidPatIndex());
+ Order.Append();
}
break;
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -737,8 +737,8 @@
header.norder++;
if ((Order[i] >= header.patterns) && (Order[i] < MAX_PATTERNS)) header.patterns = Order[i]+1;
}*/
- if(Order.GetCount() < MAX_ORDERS)
- Order.resize(MAX_ORDERS, Order.GetInvalidPatIndex());
+ if(Order.GetLength() < MAX_ORDERS)
+ Order.resize(MAX_ORDERS);
for (i=MAX_ORDERS-1; i>=0; i--) { // walk backwards over orderlist
if ((Order[i]!=0xFF) && (header.norder==0)) {
Modified: trunk/OpenMPT/soundlib/ModSequence.cpp
===================================================================
--- trunk/OpenMPT/soundlib/ModSequence.cpp 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/soundlib/ModSequence.cpp 2009-09-16 19:05:00 UTC (rev 366)
@@ -1,127 +1,96 @@
#include "stdafx.h"
#include "sndfile.h"
#include "ModSequence.h"
+#include "../mptrack/version.h"
#include "../mptrack/serialization_utils.h"
#define str_SequenceTruncationNote (GetStrI18N((_TEXT("Module has sequence of length %u; it will be truncated to maximum supported length, %u."))))
-DWORD COrderToPatternTable::Deserialize(const BYTE* const src, const DWORD memLength)
-//-------------------------------------------------------------------------
-{
- if(memLength < 2 + 4) return 0;
- uint16 version = 0;
- uint32 s = 0;
- DWORD memPos = 0;
- memcpy(&version, src, sizeof(version));
- memPos += sizeof(version);
- if(version != 0) return memPos;
- memcpy(&s, src+memPos, sizeof(s));
- memPos += sizeof(s);
- if(s > 65000) return true;
- if(memLength < memPos+s*4) return memPos;
+#define new DEBUG_NEW
- const uint32 nOriginalSize = s;
- if(s > ModSpecs::mptm.ordersMax)
- s = ModSpecs::mptm.ordersMax;
- resize(max(s, MAX_ORDERS));
- for(size_t i = 0; i<s; i++, memPos +=4 )
- {
- uint32 temp;
- memcpy(&temp, src+memPos, 4);
- (*this)[i] = static_cast<PATTERNINDEX>(temp);
- }
- memPos += 4*(nOriginalSize - s);
- return memPos;
-}
+ModSequence::ModSequence(const CSoundFile& rSf,
+ PATTERNINDEX* pArray,
+ ORDERINDEX nSize,
+ ORDERINDEX nCapacity,
+ const bool bDeletableArray) :
+ m_pSndFile(&rSf),
+ m_pArray(pArray),
+ m_nSize(nSize),
+ m_nCapacity(nCapacity),
+ m_bDeletableArray(bDeletableArray),
+ m_nInvalidIndex(0xFF),
+ m_nIgnoreIndex(0xFE)
+//-------------------------------------------------------
+{}
-size_t COrderToPatternTable::WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize)
-//-----------------------------------------------------------------------------
+ModSequence::ModSequence(const CSoundFile& rSf, ORDERINDEX nSize) :
+ m_pSndFile(&rSf),
+ m_bDeletableArray(true),
+ m_nInvalidIndex(GetInvalidPatIndex(MOD_TYPE_MPT)),
+ m_nIgnoreIndex(GetIgnoreIndex(MOD_TYPE_MPT))
+//-------------------------------------------------------------------
{
- if(numOfBytes > destSize) return true;
- if(size() < numOfBytes) resize(numOfBytes, 0xFF);
- UINT i = 0;
- for(i = 0; i<numOfBytes; i++)
- {
- dest[i] = static_cast<BYTE>((*this)[i]);
- }
- return i; //Returns the number of bytes written.
+ m_nSize = nSize;
+ m_nCapacity = m_nSize;
+ m_pArray = new PATTERNINDEX[m_nCapacity];
+ std::fill(begin(), end(), GetInvalidPatIndex(MOD_TYPE_MPT));
}
-size_t COrderToPatternTable::WriteAsByte(FILE* f, const UINT count)
-//---------------------------------------------------------------
+ModSequence::ModSequence(const ModSequence& seq) :
+ m_pSndFile(seq.m_pSndFile),
+ m_bDeletableArray(false),
+ m_nInvalidIndex(0xFF),
+ m_nIgnoreIndex(0xFE),
+ m_nSize(0),
+ m_nCapacity(0),
+ m_pArray(nullptr)
+//------------------------------------------
{
- if(size() < count) resize(count, GetInvalidPatIndex());
-
- size_t i = 0;
-
- for(i = 0; i<count; i++)
- {
- const PATTERNINDEX pat = (*this)[i];
- BYTE temp = static_cast<BYTE>((*this)[i]);
-
- if(pat > 0xFD)
- {
- if(pat == GetInvalidPatIndex()) temp = 0xFF;
- else temp = 0xFE;
- }
- fwrite(&temp, 1, 1, f);
- }
- return i; //Returns the number of bytes written.
+ *this = seq;
}
-bool COrderToPatternTable::ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength)
-//-------------------------------------------------------------------------
-{
- if(howMany < 0 || howMany > memLength) return true;
- if(m_rSndFile.GetType() != MOD_TYPE_MPT && howMany > MAX_ORDERS) return true;
-
- if(size() < static_cast<size_t>(howMany))
- resize(howMany, GetInvalidPatIndex());
-
- for(int i = 0; i<howMany; i++, pFrom++)
- (*this)[i] = *pFrom;
- return false;
-}
-
-bool COrderToPatternTable::NeedsExtraDatafield() const
-//----------------------------------------------
+bool ModSequence::NeedsExtraDatafield() const
+//-------------------------------------------
{
- if(m_rSndFile.GetType() == MOD_TYPE_MPT && m_rSndFile.Patterns.Size() > 0xFD)
+ if(m_pSndFile->GetType() == MOD_TYPE_MPT && m_pSndFile->Patterns.Size() > 0xFD)
return true;
else
return false;
}
-void COrderToPatternTable::OnModTypeChanged(const MODTYPE oldtype)
-//----------------------------------------------------------------
+void ModSequence::OnModTypeChanged(const MODTYPE oldtype)
+//-------------------------------------------------------
{
- const CModSpecifications specs = m_rSndFile.GetModSpecifications();
+ const CModSpecifications specs = m_pSndFile->GetModSpecifications();
+ m_nInvalidIndex = GetInvalidPatIndex(m_pSndFile->GetType());
+ m_nIgnoreIndex = GetIgnoreIndex(m_pSndFile->GetType());
+
//Resize orderlist if needed. Because old orderlist had MAX_ORDERS(256) elements, not making it
//smaller than that even if the modtype doesn't support that many orders.
- if(specs.ordersMax < GetCount())
+ if (specs.ordersMax < GetLength())
{
resize(max(MAX_ORDERS, specs.ordersMax));
- for(ORDERINDEX i = GetCount(); i>specs.ordersMax; --i) (*this)[i-1] = GetInvalidPatIndex();
+ std::fill(begin() + specs.ordersMax, end(), GetInvalidPatIndex());
}
- if (GetCount() < MAX_ORDERS)
- resize(MAX_ORDERS, GetInvalidPatIndex());
+ if (GetLength() < MAX_ORDERS)
+ resize(MAX_ORDERS, GetInvalidPatIndex(oldtype));
//Replace items used to denote end of song/skip order.
- replace(begin(), end(), GetInvalidPatIndex(oldtype), GetInvalidPatIndex());
- replace(begin(), end(), GetIgnoreIndex(oldtype), GetIgnoreIndex());
+ Replace(GetInvalidPatIndex(oldtype), GetInvalidPatIndex());
+ Replace(GetIgnoreIndex(oldtype), GetIgnoreIndex());
}
-ORDERINDEX COrderToPatternTable::GetLengthTailTrimmed() const
-//-----------------------------------------------------------
+ORDERINDEX ModSequence::GetLengthTailTrimmed() const
+//--------------------------------------------------
{
- ORDERINDEX nEnd = GetCount();
+ ORDERINDEX nEnd = GetLength();
if(nEnd == 0) return 0;
nEnd--;
const PATTERNINDEX iInvalid = GetInvalidPatIndex();
@@ -131,59 +100,275 @@
}
-ORDERINDEX COrderToPatternTable::GetLengthFirstEmpty() const
-//----------------------------------------------------------
+ORDERINDEX ModSequence::GetLengthFirstEmpty() const
+//-------------------------------------------------
{
- const ORDERINDEX nLength = GetCount();
- ORDERINDEX nMax = 0;
- while ((nMax < nLength) && ((*this)[nMax] != (*this).GetInvalidPatIndex())) nMax++;
- return nMax;
+ return static_cast<ORDERINDEX>(std::find(begin(), end(), GetInvalidPatIndex()) - begin());
}
-ORDERINDEX COrderToPatternTable::GetNextOrderIgnoringSkips(const ORDERINDEX start) const
-//-------------------------------------------------------------------------------------
+ORDERINDEX ModSequence::GetNextOrderIgnoringSkips(const ORDERINDEX start) const
+//-----------------------------------------------------------------------------
{
- const ORDERINDEX count = GetCount();
- if(count == 0) return 0;
- ORDERINDEX next = min(count-1, start+1);
- while(next+1 < count && (*this)[next] == GetIgnoreIndex()) next++;
+ const ORDERINDEX nLength = GetLength();
+ if(nLength == 0) return 0;
+ ORDERINDEX next = min(nLength-1, start+1);
+ while(next+1 < nLength && (*this)[next] == GetIgnoreIndex()) next++;
return next;
}
-ORDERINDEX COrderToPatternTable::GetPreviousOrderIgnoringSkips(const ORDERINDEX start) const
-//-------------------------------------------------------------------------------------
+
+ORDERINDEX ModSequence::GetPreviousOrderIgnoringSkips(const ORDERINDEX start) const
+//---------------------------------------------------------------------------------
{
- const ORDERINDEX count = GetCount();
- if(start == 0 || count == 0) return 0;
- ORDERINDEX prev = min(start-1, count-1);
+ const ORDERINDEX nLength = GetLength();
+ if(start == 0 || nLength == 0) return 0;
+ ORDERINDEX prev = min(start-1, nLength-1);
while(prev > 0 && (*this)[prev] == GetIgnoreIndex()) prev--;
return prev;
}
-void COrderToPatternTable::Init()
-//-------------------------------
+void ModSequence::Init()
+//----------------------
{
- resize(MAX_ORDERS, GetInvalidPatIndex());
- for(ORDERINDEX i = 0; i < GetCount(); i++)
+ resize(MAX_ORDERS);
+ std::fill(begin(), end(), GetInvalidPatIndex());
+}
+
+
+void ModSequence::Append(PATTERNINDEX nPat)
+//-----------------------------------------
+{
+ resize(m_nSize + 1, nPat);
+}
+
+
+void ModSequence::resize(ORDERINDEX nNewSize, PATTERNINDEX nFill)
+//---------------------------------------------------------------
+{
+ if (nNewSize == m_nSize) return;
+ if (nNewSize <= m_nCapacity)
{
- (*this)[i] = GetInvalidPatIndex();
+ if (nNewSize > m_nSize)
+ std::fill(begin() + m_nSize, begin() + nNewSize, nFill);
+ m_nSize = nNewSize;
}
+ else
+ {
+ const PATTERNINDEX* const pOld = m_pArray;
+ m_nCapacity = nNewSize + 100;
+ m_pArray = new PATTERNINDEX[m_nCapacity];
+ ArrayCopy(m_pArray, pOld, m_nSize);
+ std::fill(m_pArray + m_nSize, m_pArray + nNewSize, nFill);
+ m_nSize = nNewSize;
+ if (m_bDeletableArray)
+ delete[] pOld;
+ m_bDeletableArray = true;
+ }
}
+void ModSequence::clear()
+//-----------------------
+{
+ m_nSize = 0;
+}
-PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65535 : 0xFF;}
-PATTERNINDEX COrderToPatternTable::GetIgnoreIndex(const MODTYPE type) {return type == MOD_TYPE_MPT ? 65534 : 0xFE;}
-PATTERNINDEX COrderToPatternTable::GetInvalidPatIndex() const {return GetInvalidPatIndex(m_rSndFile.GetType());}
-PATTERNINDEX COrderToPatternTable::GetIgnoreIndex() const {return GetIgnoreIndex(m_rSndFile.GetType());}
+ModSequence& ModSequence::operator=(const ModSequence& seq)
+//---------------------------------------------------------
+{
+ if (&seq == this)
+ return *this;
+ m_nIgnoreIndex = seq.m_nIgnoreIndex;
+ m_nInvalidIndex = seq.m_nInvalidIndex;
+ resize(seq.GetLength());
+ ArrayCopy(begin(), seq.begin(), m_nSize);
+ m_sName = seq.m_sName;
+ return *this;
+}
-void ReadModSequence(std::istream& iStrm, COrderToPatternTable& seq, const size_t)
-//--------------------------------------------------------------------------------
+
+/////////////////////////////////////
+// ModSequenceSet
+/////////////////////////////////////
+
+
+ModSequenceSet::ModSequenceSet(const CSoundFile& sndFile)
+ : ModSequence(sndFile, m_Cache, s_nCacheSize, s_nCacheSize, NoArrayDelete),
+ m_nCurrentSeq(0)
+//-------------------------------------------------------------------
{
+ m_Sequences.push_back(ModSequence(sndFile, s_nCacheSize));
+}
+
+
+const ModSequence& ModSequenceSet::GetSequence(SEQUENCEINDEX nSeq)
+//----------------------------------------------------------------
+{
+ if (nSeq == GetCurrentSequenceIndex())
+ CopyCacheToStorage();
+ return m_Sequences[nSeq];
+}
+
+
+void ModSequenceSet::CopyCacheToStorage()
+//---------------------------------------
+{
+ m_Sequences[m_nCurrentSeq] = *this;
+}
+
+
+void ModSequenceSet::CopyStorageToCache()
+//---------------------------------------
+{
+ const ModSequence& rSeq = m_Sequences[m_nCurrentSeq];
+ if (rSeq.GetLength() <= s_nCacheSize)
+ {
+ PATTERNINDEX* pOld = m_pArray;
+ m_pArray = m_Cache;
+ m_nSize = rSeq.GetLength();
+ m_nCapacity = s_nCacheSize;
+ m_sName = rSeq.m_sName;
+ ArrayCopy(m_pArray, rSeq.m_pArray, m_nSize);
+ if (m_bDeletableArray)
+ delete[] pOld;
+ m_bDeletableArray = false;
+ }
+ else
+ ModSequence::operator=(rSeq);
+}
+
+
+void ModSequenceSet::SetSequence(SEQUENCEINDEX n)
+//-----------------------------------------------
+{
+ CopyCacheToStorage();
+ m_nCurrentSeq = n;
+ CopyStorageToCache();
+}
+
+
+void ModSequenceSet::AddSequence(bool bDuplicate)
+//-----------------------------------------------
+{
+ m_Sequences.push_back(ModSequence(*m_pSndFile, s_nCacheSize));
+ if (bDuplicate)
+ {
+ m_Sequences.back() = *this;
+ m_Sequences.back().m_sName = ""; // Don't copy sequence name.
+ }
+ SetSequence(GetNumSequences() - 1);
+}
+
+
+void ModSequenceSet::RemoveSequence(SEQUENCEINDEX i)
+//--------------------------------------------------
+{
+ // Do nothing if index is invalid or if there's only one sequence left.
+ if (i >= m_Sequences.size() || m_Sequences.size() <= 1)
+ return;
+ const bool bSequenceChanges = (i == m_nCurrentSeq);
+ m_Sequences.erase(m_Sequences.begin() + i);
+ if (i < m_nCurrentSeq || m_nCurrentSeq >= GetNumSequences())
+ m_nCurrentSeq--;
+ if (bSequenceChanges)
+ CopyStorageToCache();
+}
+
+
+/////////////////////////////////////
+// Read/Write
+/////////////////////////////////////
+
+
+DWORD ModSequence::Deserialize(const BYTE* const src, const DWORD memLength)
+//--------------------------------------------------------------------------
+{
+ if(memLength < 2 + 4) return 0;
+ uint16 version = 0;
+ uint16 s = 0;
+ DWORD memPos = 0;
+ memcpy(&version, src, sizeof(version));
+ memPos += sizeof(version);
+ if(version != 0) return memPos;
+ memcpy(&s, src+memPos, sizeof(s));
+ memPos += 4;
+ if(s > 65000) return true;
+ if(memLength < memPos+s*4) return memPos;
+
+ const uint16 nOriginalSize = s;
+ LimitMax(s, ModSpecs::mptm.ordersMax);
+
+ resize(max(s, MAX_ORDERS));
+ for(size_t i = 0; i<s; i++, memPos +=4 )
+ {
+ uint32 temp;
+ memcpy(&temp, src+memPos, 4);
+ (*this)[i] = static_cast<PATTERNINDEX>(temp);
+ }
+ memPos += 4*(nOriginalSize - s);
+ return memPos;
+}
+
+
+size_t ModSequence::WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize)
+//-----------------------------------------------------------------------------
+{
+ if(numOfBytes > destSize || numOfBytes > MAX_ORDERS) return true;
+ if(GetLength() < numOfBytes) resize(ORDERINDEX(numOfBytes), 0xFF);
+ UINT i = 0;
+ for(i = 0; i<numOfBytes; i++)
+ {
+ dest[i] = static_cast<BYTE>((*this)[i]);
+ }
+ return i; //Returns the number of bytes written.
+}
+
+
+size_t ModSequence::WriteAsByte(FILE* f, const uint16 count)
+//----------------------------------------------------------
+{
+ if(GetLength() < count) resize(count);
+
+ size_t i = 0;
+
+ for(i = 0; i<count; i++)
+ {
+ const PATTERNINDEX pat = (*this)[i];
+ BYTE temp = static_cast<BYTE>((*this)[i]);
+
+ if(pat > 0xFD)
+ {
+ if(pat == GetInvalidPatIndex()) temp = 0xFF;
+ else temp = 0xFE;
+ }
+ fwrite(&temp, 1, 1, f);
+ }
+ return i; //Returns the number of bytes written.
+}
+
+
+bool ModSequence::ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength)
+//-------------------------------------------------------------------------------------
+{
+ if(howMany < 0 || howMany > memLength) return true;
+ if(m_pSndFile->GetType() != MOD_TYPE_MPT && howMany > MAX_ORDERS) return true;
+
+ if(GetLength() < static_cast<size_t>(howMany))
+ resize(ORDERINDEX(howMany));
+
+ for(int i = 0; i<howMany; i++, pFrom++)
+ (*this)[i] = *pFrom;
+ return false;
+}
+
+
+void ReadModSequenceOld(std::istream& iStrm, ModSequenceSet& seq, const size_t)
+//-----------------------------------------------------------------------------
+{
uint16 size;
srlztn::Binaryread<uint16>(iStrm, size);
if(size > ModSpecs::mptm.ordersMax)
@@ -193,7 +378,7 @@
AfxMessageBox(str, MB_ICONWARNING);
size = ModSpecs::mptm.ordersMax;
}
- seq.resize(max(size, MAX_ORDERS), seq.GetInvalidPatIndex());
+ seq.resize(max(size, MAX_ORDERS));
if(size == 0)
{ seq.Init(); return; }
@@ -206,16 +391,91 @@
}
-void WriteModSequence(std::ostream& oStrm, const COrderToPatternTable& seq)
+void WriteModSequenceOld(std::ostream& oStrm, const ModSequenceSet& seq)
//-------------------------------------------------------------------------
{
- uint16 size = seq.GetCount();
+ const uint16 size = seq.GetLength();
srlztn::Binarywrite<uint16>(oStrm, size);
- const COrderToPatternTable::const_iterator endIter = seq.end();
- for(COrderToPatternTable::const_iterator citer = seq.begin(); citer != endIter; citer++)
+ const ModSequenceSet::const_iterator endIter = seq.end();
+ for(ModSequenceSet::const_iterator citer = seq.begin(); citer != endIter; citer++)
{
const uint16 temp = static_cast<uint16>(*citer);
srlztn::Binarywrite<uint16>(oStrm, temp);
}
}
+
+void WriteModSequence(std::ostream& oStrm, const ModSequence& seq)
+//----------------------------------------------------------------
+{
+ srlztn::Ssb ssb(oStrm);
+ ssb.BeginWrite(FileIdSequence, MptVersion::num);
+ ssb.WriteItem((LPCSTR)seq.m_sName, "n");
+ const uint16 nLength = seq.GetLengthTailTrimmed();
+ ssb.WriteItem<uint16>(nLength, "l");
+ ssb.WriteItem(seq.m_pArray, "a", 1, srlztn::ArrayWriter<uint16>(nLength));
+ ssb.FinishWrite();
+}
+
+
+void ReadModSequence(std::istream& iStrm, ModSequence& seq, const size_t)
+//-----------------------------------------------------------------------
+{
+ srlztn::Ssb ssb(iStrm);
+ ssb.BeginRead(FileIdSequence, MptVersion::num);
+ if ((ssb.m_Status & srlztn::SNT_FAILURE) != 0)
+ return;
+ std::string str;
+ ssb.ReadItem(str, "n");
+ seq.m_sName = str.c_str();
+ uint16 nSize = MAX_ORDERS;
+ ssb.ReadItem<uint16>(nSize, "l");
+ LimitMax(nSize, ModSpecs::mptm.ordersMax);
+ seq.resize(max(nSize, ModSequenceSet::s_nCacheSize));
+ ssb.ReadItem(seq.m_pArray, "a", 1, srlztn::ArrayReader<uint16>(nSize));
+}
+
+
+void WriteModSequences(std::ostream& oStrm, const ModSequenceSet& seq)
+//--------------------------------------------------------------------
+{
+ srlztn::Ssb ssb(oStrm);
+ ssb.BeginWrite(FileIdSequences, MptVersion::num);
+ const uint8 nSeqs = seq.GetNumSequences();
+ const uint8 nCurrent = seq.GetCurrentSequenceIndex();
+ ssb.WriteItem(nSeqs, "n");
+ ssb.WriteItem(nCurrent, "c");
+ for(uint8 i = 0; i < nSeqs; i++)
+ {
+ if (i == seq.GetCurrentSequenceIndex())
+ ssb.WriteItem(seq, &i, sizeof(i), &WriteModSequence);
+ else
+ ssb.WriteItem(seq.m_Sequences[i], &i, sizeof(i), &WriteModSequence);
+ }
+ ssb.FinishWrite();
+}
+
+
+void ReadModSequences(std::istream& iStrm, ModSequenceSet& seq, const size_t)
+//---------------------------------------------------------------------------
+{
+ srlztn::Ssb ssb(iStrm);
+ ssb.BeginRead(FileIdSequences, MptVersion::num);
+ if ((ssb.m_Status & srlztn::SNT_FAILURE) != 0)
+ return;
+ uint8 nSeqs;
+ uint8 nCurrent;
+ ssb.ReadItem(nSeqs, "n");
+ if (nSeqs == 0)
+ return;
+ LimitMax(nSeqs, MAX_SEQUENCES);
+ ssb.ReadItem(nCurrent, "c");
+ if (seq.GetNumSequences() < nSeqs)
+ seq.m_Sequences.resize(nSeqs, ModSequence(*seq.m_pSndFile, seq.s_nCacheSize));
+
+ for(uint8 i = 0; i < nSeqs; i++)
+ ssb.ReadItem(seq.m_Sequences[i], &i, sizeof(i), &ReadModSequence);
+ seq.m_nCurrentSeq = (nCurrent < seq.GetNumSequences()) ? nCurrent : 0;
+ seq.CopyStorageToCache();
+}
+
Modified: trunk/OpenMPT/soundlib/ModSequence.h
===================================================================
--- trunk/OpenMPT/soundlib/ModSequence.h 2009-09-15 22:10:35 UTC (rev 365)
+++ trunk/OpenMPT/soundlib/ModSequence.h 2009-09-16 19:05:00 UTC (rev 366)
@@ -1,68 +1,160 @@
-#ifndef ORDERTOPATTERNTABLE_H
-#define ORDERTOPATTERNTABLE_H
+#ifndef MOD_SEQUENCE_H
+#define MOD_SEQUENCE_H
#include <vector>
-using std::vector;
class CSoundFile;
+class ModSequenceSet;
-
-#pragma warning(disable:4244) //conversion from 'type1' to 'type2', possible loss of data.
-
-
-//==============================================
-class COrderToPatternTable : public vector<PATTERNINDEX>
-//==============================================
+class ModSequence
+//===============
{
public:
- COrderToPatternTable(const CSoundFile& sndFile) : m_rSndFile(sndFile) {}
+ friend class ModSequenceSet;
+ typedef PATTERNINDEX* iterator;
+ typedef const PATTERNINDEX* const_iterator;
+
+ friend void WriteModSequence(std::ostream& oStrm, const ModSequence& seq);
+ friend void ReadModSequence(std::istream& iStrm, ModSequence& seq, const size_t);
+ virtual ~ModSequence() {if (m_bDeletableArray) delete[] m_pArray;}
+ ModSequence(const ModSequence&);
+ ModSequence(const CSoundFile& rSf, ORDERINDEX nSize);
+ ModSequence(const CSoundFile& rSf, PATTERNINDEX* pArray, ORDERINDEX nSize, ORDERINDEX nCapacity, bool bDeletableArray);
+
// Initialize default sized sequence.
void Init();
- bool ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength);
+ PATTERNINDEX& operator[](const size_t i) {ASSERT(i < m_nSize); return m_pArray[i];}
+ const PATTERNINDEX& operator[](const size_t i) const {ASSERT(i < m_nSize); return m_pArray[i];}
- size_t WriteAsByte(FILE* f, const UINT count);
+ PATTERNINDEX& Last() {ASSERT(m_nSize > 0); return m_pArray[m_nSize-1];}
+ const PATTERNINDEX& L...
[truncated message content] |
|
From: <sag...@us...> - 2009-09-15 22:10:56
|
Revision: 365
http://modplug.svn.sourceforge.net/modplug/?rev=365&view=rev
Author: saga-games
Date: 2009-09-15 22:10:35 +0000 (Tue, 15 Sep 2009)
Log Message:
-----------
[New] Shareable color schemes (via config dialog)
[Fix] Instrument tab: Pitch/Pan input field allows negative values
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/Moptions.h
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/resource.h
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-15 17:15:29 UTC (rev 364)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-15 22:10:35 UTC (rev 365)
@@ -117,21 +117,23 @@
BEGIN_MESSAGE_MAP(COptionsColors, CPropertyPage)
ON_WM_DRAWITEM()
- ON_CBN_SELCHANGE(IDC_COMBO1, OnColorSelChanged)
- ON_EN_CHANGE(IDC_PRIMARYHILITE,OnSettingsChanged)
+ ON_CBN_SELCHANGE(IDC_COMBO1, OnColorSelChanged)
+ ON_EN_CHANGE(IDC_PRIMARYHILITE, OnSettingsChanged)
ON_EN_CHANGE(IDC_SECONDARYHILITE, OnSettingsChanged)
- ON_COMMAND(IDC_BUTTON1, OnSelectColor1)
- ON_COMMAND(IDC_BUTTON2, OnSelectColor2)
- ON_COMMAND(IDC_BUTTON3, OnSelectColor3)
- ON_COMMAND(IDC_BUTTON5, OnPresetMPT)
- ON_COMMAND(IDC_BUTTON6, OnPresetFT2)
- ON_COMMAND(IDC_BUTTON7, OnPresetIT)
- ON_COMMAND(IDC_BUTTON8, OnPresetBuzz)
- ON_COMMAND(IDC_CHECK1, OnSettingsChanged)
- ON_COMMAND(IDC_CHECK2, OnPreviewChanged)
- ON_COMMAND(IDC_CHECK3, OnSettingsChanged)
- ON_COMMAND(IDC_CHECK4, OnPreviewChanged)
- ON_COMMAND(IDC_CHECK5, OnHiliteTimeSigsChanged)
+ ON_COMMAND(IDC_BUTTON1, OnSelectColor1)
+ ON_COMMAND(IDC_BUTTON2, OnSelectColor2)
+ ON_COMMAND(IDC_BUTTON3, OnSelectColor3)
+ ON_COMMAND(IDC_BUTTON5, OnPresetMPT)
+ ON_COMMAND(IDC_BUTTON6, OnPresetFT2)
+ ON_COMMAND(IDC_BUTTON7, OnPresetIT)
+ ON_COMMAND(IDC_BUTTON8, OnPresetBuzz)
+ ON_COMMAND(IDC_LOAD_COLORSCHEME, OnLoadColorScheme)
+ ON_COMMAND(IDC_SAVE_COLORSCHEME, OnSaveColorScheme)
+ ON_COMMAND(IDC_CHECK1, OnSettingsChanged)
+ ON_COMMAND(IDC_CHECK2, OnPreviewChanged)
+ ON_COMMAND(IDC_CHECK3, OnSettingsChanged)
+ ON_COMMAND(IDC_CHECK4, OnPreviewChanged)
+ ON_COMMAND(IDC_CHECK5, OnHiliteTimeSigsChanged)
END_MESSAGE_MAP()
@@ -538,7 +540,7 @@
CustomColors[MODCOLOR_TEXTCURROW] = 0x00000000;
CustomColors[MODCOLOR_BACKSELECTED] = 0x00000000;
CustomColors[MODCOLOR_TEXTSELECTED] = 0x00ccd7dd;
- //CustomColors[MODCOLOR_SAMPLE] = 0x0000ff00;
+ CustomColors[MODCOLOR_SAMPLE] = 0x0000ff00;
CustomColors[MODCOLOR_BACKPLAYCURSOR] = 0x007a99a9;
CustomColors[MODCOLOR_TEXTPLAYCURSOR] = 0x00000000;
CustomColors[MODCOLOR_BACKHILIGHT] = 0x00b5c5ce;
@@ -548,10 +550,54 @@
CustomColors[MODCOLOR_PANNING] = 0x00686800;
CustomColors[MODCOLOR_PITCH] = 0x00006262;
CustomColors[MODCOLOR_GLOBALS] = 0x00000066;
- //CustomColors[MODCOLOR_ENVELOPES] = 0x000000ff;
+ CustomColors[MODCOLOR_ENVELOPES] = 0x000000ff;
OnPreviewChanged();
}
+void COptionsColors::OnLoadColorScheme()
+//--------------------------------------
+{
+ CFileDialog dlg(TRUE, NULL, NULL,
+ OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
+ "OpenMPT Color Schemes|*.mptcolor|"
+ "All Files (*.*)|*.*||",
+ this);
+ if (dlg.DoModal() != IDOK) return;
+
+
+ TCHAR sFilename[MAX_PATH];
+ strcpy(sFilename, dlg.GetPathName());
+
+ for(int i = 0; i < MAX_MODCOLORS; i++)
+ {
+ TCHAR sKeyName[16];
+ wsprintf(sKeyName, "Color%02d", i);
+ CustomColors[i] = CMainFrame::GetPrivateProfileLong("Colors", sKeyName, CustomColors[i], sFilename);
+ }
+ OnPreviewChanged();
+}
+
+void COptionsColors::OnSaveColorScheme()
+//--------------------------------------
+{
+ CFileDialog dlg(FALSE, "mptcolor", NULL,
+ OFN_HIDEREADONLY| OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN,
+ "OpenMPT Color Schemes|*.mptcolor|",
+ this);
+ if (dlg.DoModal() != IDOK) return;
+
+ TCHAR sFilename[MAX_PATH];
+ strcpy(sFilename, dlg.GetPathName());
+
+ for(int i = 0; i < MAX_MODCOLORS; i++)
+ {
+ TCHAR sKeyName[16];
+ wsprintf(sKeyName, "Color%02d", i);
+ CMainFrame::WritePrivateProfileLong("Colors", sKeyName, CustomColors[i], sFilename);
+ }
+}
+
+
/////////////////////////////////////////////////////////////////////////////////
// COptionsGeneral
Modified: trunk/OpenMPT/mptrack/Moptions.h
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.h 2009-09-15 17:15:29 UTC (rev 364)
+++ trunk/OpenMPT/mptrack/Moptions.h 2009-09-15 22:10:35 UTC (rev 365)
@@ -81,6 +81,8 @@
afx_msg void OnPresetFT2();
afx_msg void OnPresetIT();
afx_msg void OnPresetBuzz();
+ afx_msg void OnLoadColorScheme();
+ afx_msg void OnSaveColorScheme();
afx_msg void OnPreviewChanged();
DECLARE_MESSAGE_MAP();
};
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2009-09-15 17:15:29 UTC (rev 364)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2009-09-15 22:10:35 UTC (rev 365)
@@ -210,7 +210,7 @@
PUSHBUTTON "Clear Log",IDC_CLEARLOG,227,85,37,9
END
-IDD_OPTIONS_COLORS DIALOGEX 0, 0, 272, 231
+IDD_OPTIONS_COLORS DIALOGEX 0, 0, 272, 281
STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Colors"
FONT 8, "MS Sans Serif", 0, 0, 0x0
@@ -222,24 +222,26 @@
EDITTEXT IDC_SECONDARYHILITE,114,108,21,12,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "Enable effect highlighting",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,60,114,10
CONTROL "Use small font",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,45,102,10
- PUSHBUTTON "MPT",IDC_BUTTON5,159,26,22,12
- PUSHBUTTON "FT2",IDC_BUTTON6,185,26,22,12
- PUSHBUTTON "IT",IDC_BUTTON7,210,25,22,12
- PUSHBUTTON "Buzz",IDC_BUTTON8,235,25,22,12
+ PUSHBUTTON "MPT",IDC_BUTTON5,144,246,24,15
+ PUSHBUTTON "FT2",IDC_BUTTON6,204,246,24,15
+ PUSHBUTTON "IT",IDC_BUTTON7,174,246,24,15
+ PUSHBUTTON "Buzz",IDC_BUTTON8,234,246,24,15
CONTROL "Color",IDC_BUTTON1,"Button",BS_OWNERDRAW,25,194,51,15
CONTROL "Color",IDC_BUTTON2,"Button",BS_OWNERDRAW,98,194,51,15
CONTROL "Color",IDC_BUTTON3,"Button",BS_OWNERDRAW,168,194,51,15
LTEXT "Background:",IDC_TEXT1,25,183,60,8
LTEXT "Foreground:",IDC_TEXT2,98,183,62,8
LTEXT "Highlight:",IDC_TEXT3,169,185,61,8
- GROUPBOX "",IDC_STATIC,5,5,260,220
+ GROUPBOX "",IDC_STATIC,5,5,260,211
LTEXT "Select color for:",IDC_STATIC,15,15,63,8
LTEXT "rows",IDC_STATIC,138,92,16,8
- LTEXT "Presets:",IDC_STATIC,159,15,28,8
LTEXT "rows",IDC_STATIC,138,110,16,8
CONTROL "",IDC_BUTTON4,"Button",BS_OWNERDRAW | BS_FLAT,65,130,114,43
CONTROL "Set highlights to songs' time signatures",IDC_CHECK5,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,75,136,10
+ PUSHBUTTON "Load...",IDC_LOAD_COLORSCHEME,18,246,48,15
+ PUSHBUTTON "Save...",IDC_SAVE_COLORSCHEME,72,246,48,15
+ GROUPBOX "Color Presets",IDC_STATIC,6,228,264,42
END
IDD_OPTIONS_MIDI DIALOGEX 0, 0, 272, 281
@@ -478,7 +480,7 @@
CONTROL "Pan",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,55,71,29,10
EDITTEXT IDC_EDIT9,87,70,34,12,ES_NUMBER
CONTROL "Spin1",IDC_SPIN9,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,74,8,11
- EDITTEXT IDC_EDIT15,33,99,27,13,ES_NUMBER
+ EDITTEXT IDC_EDIT15,33,99,27,13
CONTROL "Spin1",IDC_SPIN12,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,61,103,7,11
COMBOBOX IDC_COMBO4,95,99,27,91,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_SLIDER5,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS,47,135,36,10
@@ -1399,7 +1401,7 @@
IDD_OPTIONS_COLORS, DIALOG
BEGIN
RIGHTMARGIN, 247
- BOTTOMMARGIN, 151
+ BOTTOMMARGIN, 201
END
IDD_OPTIONS_MIDI, DIALOG
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-09-15 17:15:29 UTC (rev 364)
+++ trunk/OpenMPT/mptrack/resource.h 2009-09-15 22:10:35 UTC (rev 365)
@@ -883,6 +883,8 @@
#define IDC_RADIO_RESIZETO 2384
#define IDC_EDIT_MODLOADING_WARNINGS 2385
#define IDC_CHECK_PATRECORD 2386
+#define IDC_LOAD_COLORSCHEME 2387
+#define IDC_SAVE_COLORSCHEME 2388
#define ID_FILE_NEWMOD 32771
#define ID_FILE_NEWXM 32772
#define ID_FILE_NEWS3M 32773
@@ -1116,7 +1118,7 @@
#define ID_OVERFLOWPASTE 59226
#define ID_NOTEMAP_COPY_NOTE 59227
#define ID_CLEANUP_REARRANGESAMPLES 59228
-#define ID_ORDERLIST_RENDER 59229
+#define ID_ORDERLIST_RENDER 59229
// Next default values for new objects
//
@@ -1125,7 +1127,7 @@
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 521
#define _APS_NEXT_COMMAND_VALUE 59230
-#define _APS_NEXT_CONTROL_VALUE 2387
+#define _APS_NEXT_CONTROL_VALUE 2389
#define _APS_NEXT_SYMED_VALUE 901
#endif
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-15 17:15:39
|
Revision: 364
http://modplug.svn.sourceforge.net/modplug/?rev=364&view=rev
Author: saga-games
Date: 2009-09-15 17:15:29 +0000 (Tue, 15 Sep 2009)
Log Message:
-----------
[Fix] Wave Export: Order mode was always enabled by default.
[Fix] IT Compatibility: Special case of Retrigger + Envelopes
[Fix] Instrument / Sample tab: Remove special chars from sample filenames so the "save as" dialog will show up on OSs < Vista
[Mod] Instrument tab: Also show values from 0 to 64 for filter envelope (instead of -32 to 32)
[Imp] Macro Config: Also show the current preset for Zxx config (Z80 - ZFF)
[Ref] Changed some BOOLs into bools, usage of *INDEX types
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_ins.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/dlg_misc.cpp
trunk/OpenMPT/mptrack/misc_util.h
trunk/OpenMPT/mptrack/mod2midi.cpp
trunk/OpenMPT/soundlib/Sampleio.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -1603,7 +1603,7 @@
void CCtrlInstruments::OnInstrumentSave()
//---------------------------------------
{
- CHAR szFileName[_MAX_PATH] = "", drive[_MAX_DRIVE], path[_MAX_PATH], ext[_MAX_EXT];
+ TCHAR szFileName[_MAX_PATH] = "", drive[_MAX_DRIVE], path[_MAX_PATH], ext[_MAX_EXT];
MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument];
if (!pIns) return;
@@ -1616,6 +1616,8 @@
memcpy(szFileName, pIns->name, 22);
szFileName[22] = 0;
}
+ SanitizeFilename(szFileName);
+
// -> CODE#0019
// -> DESC="correctly load ITI & XI instruments sample note map"
// CFileDialog dlg(FALSE, (m_pSndFile->m_nType & MOD_TYPE_IT) ? "iti" : "xi",
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -975,8 +975,8 @@
{
if(!m_pSndFile) return;
- CHAR szFileName[_MAX_PATH] = "";
- BOOL bBatchSave = CMainFrame::GetInputHandler()->ShiftPressed();
+ TCHAR szFileName[_MAX_PATH];
+ bool bBatchSave = CMainFrame::GetInputHandler()->ShiftPressed();
if(!bBatchSave)
{
@@ -993,8 +993,7 @@
} else
{
memcpy(szFileName, m_pSndFile->m_szNames[m_nSample], 32);
- szFileName[32] = 0;
- }
+ szFileName[32] = 0; }
if (!szFileName[0]) strcpy(szFileName, "untitled");
}
else
@@ -1011,6 +1010,7 @@
sPath += ".wav";
_splitpath(sPath, NULL, NULL, szFileName, NULL);
}
+ SanitizeFilename(szFileName);
CFileDialog dlg(FALSE, "wav",
szFileName,
@@ -1027,7 +1027,7 @@
TCHAR ext[_MAX_EXT];
_splitpath(dlg.GetPathName(), NULL, NULL, NULL, ext);
- BOOL bOk = FALSE;
+ bool bOk = false;
UINT iMinSmp = m_nSample, iMaxSmp = m_nSample;
CString sFilename = dlg.GetPathName(), sNumberFormat;
if(bBatchSave)
@@ -1037,24 +1037,20 @@
sNumberFormat.Format("%s%d%s", "%.", ((int)log10((float)iMaxSmp)) + 1, "d");
}
- const CString sForbiddenChars = "\\/:\"?<>*";
-
for(UINT iSmp = iMinSmp; iSmp <= iMaxSmp; iSmp++)
{
if (m_pSndFile->Samples[iSmp].pSample)
{
if(bBatchSave)
{
- CString sSampleNumber, sSampleName, sSampleFilename;
+ CString sSampleNumber;
+ TCHAR sSampleName[64], sSampleFilename[64];
sSampleNumber.Format(sNumberFormat, iSmp);
- sSampleName = (m_pSndFile->m_szNames[iSmp]) ? m_pSndFile->m_szNames[iSmp] : "untitled";
- sSampleFilename = (m_pSndFile->Samples[iSmp].filename[0]) ? m_pSndFile->Samples[iSmp].filename : m_pSndFile->m_szNames[iSmp];
- for(UINT i = 0; i < sForbiddenChars.GetLength(); i++)
- {
- sSampleName.Remove(sForbiddenChars.GetAt(i));
- sSampleFilename.Remove(sForbiddenChars.GetAt(i));
- }
+ strcpy(sSampleName, (m_pSndFile->m_szNames[iSmp]) ? m_pSndFile->m_szNames[iSmp] : "untitled");
+ strcpy(sSampleFilename, (m_pSndFile->Samples[iSmp].filename[0]) ? m_pSndFile->Samples[iSmp].filename : m_pSndFile->m_szNames[iSmp]);
+ SanitizeFilename(sSampleName);
+ SanitizeFilename(sSampleFilename);
sFilename = dlg.GetPathName();
sFilename.Replace("%sample_number%", sSampleNumber);
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -1388,7 +1388,7 @@
void CModDoc::OnFileWaveConvert()
//-------------------------------
{
- OnFileWaveConvert(0, 0);
+ OnFileWaveConvert(ORDERINDEX_INVALID, ORDERINDEX_INVALID);
}
void CModDoc::OnFileWaveConvert(ORDERINDEX nMinOrder, ORDERINDEX nMaxOrder)
@@ -2935,7 +2935,7 @@
}
HWND CModDoc::GetEditPosition(ROWINDEX &row, PATTERNINDEX &pat, ORDERINDEX &ord)
-//------------------------------------------------------------
+//------------------------------------------------------------------------------
{
HWND followSonghWnd;
PATTERNVIEWSTATE *patternViewState;
@@ -2976,7 +2976,7 @@
//ensure order correlates with pattern.
if (pSndFile->Order[ord]!=pat) {
- int tentativeOrder = pSndFile->FindOrder(pat);
+ ORDERINDEX tentativeOrder = pSndFile->FindOrder(pat);
if (tentativeOrder != -1) { //ensure a valid order exists.
ord = tentativeOrder;
}
@@ -3041,7 +3041,68 @@
return -1;
}
+// Retrieve Zxx (Z80-ZFF) type from current macro configuration
+int CModDoc::GetZxxType(const CHAR (&szMidiZXXExt)[128 * 32])
+//-----------------------------------------------------------
+{
+ // Compare with all possible preset patterns
+ for(int i = 1; i <= 5; i++)
+ {
+ // Prepare pattern to compare
+ CHAR szPatterns[128 * 32];
+ CreateZxxFromType(szPatterns, i);
+ bool bFound = true;
+ for(int j = 0; j < 128; j++)
+ {
+ if(strncmp(&szPatterns[j * 32], &szMidiZXXExt[j * 32], 32))
+ bFound = false;
+ }
+ if(bFound) return i;
+ }
+ return 0; // Type 0 - Custom setup
+}
+
+// Create Zxx (Z80 - ZFF) from one out of five presets
+void CModDoc::CreateZxxFromType(CHAR (&szMidiZXXExt)[128 * 32], int iZxxType)
+//---------------------------------------------------------------------------
+{
+ for(int i = 0; i < 128; i++)
+ {
+ switch(iZxxType)
+ {
+ case 1:
+ // Type 1 - Z80 - Z8F controls resonance
+ if (i < 16) wsprintf(&szMidiZXXExt[i * 32], "F0F001%02X", i * 8);
+ else szMidiZXXExt[i * 32] = 0;
+ break;
+
+ case 2:
+ // Type 2 - Z80 - ZFF controls resonance
+ wsprintf(&szMidiZXXExt[i * 32], "F0F001%02X", i);
+ break;
+
+ case 3:
+ // Type 3 - Z80 - ZFF controls cutoff
+ wsprintf(&szMidiZXXExt[i * 32], "F0F000%02X", i);
+ break;
+
+ case 4:
+ // Type 4 - Z80 - ZFF controls filter mode
+ wsprintf(&szMidiZXXExt[i * 32], "F0F002%02X", i);
+ break;
+
+ case 5:
+ // Type 5 - Z80 - Z9F controls resonance + filter mode
+ if (i < 16) wsprintf(&szMidiZXXExt[i * 32], "F0F001%02X", i * 8);
+ else if (i < 32) wsprintf(&szMidiZXXExt[i * 32], "F0F002%02X", (i - 16) * 8);
+ else szMidiZXXExt[i * 32] = 0;
+ break;
+ }
+ }
+}
+
+
////////////////////////////////////////////////////////////////////////////////////////
// Playback
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-09-15 17:15:29 UTC (rev 364)
@@ -181,6 +181,8 @@
int MacroToPlugParam(CString value); //rewbs.xinfo
int MacroToMidiCC(CString value);
int FindMacroForParam(long param);
+ int GetZxxType(const CHAR (&szMidiZXXExt)[128 * 32]);
+ void CreateZxxFromType(CHAR (&szMidiZXXExt)[128 * 32], int iZxxType);
void SongProperties();
// operations
public:
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -1433,7 +1433,7 @@
}
}
- for (UINT i=1; i<=m_SndFile.m_nInstruments; i++)
+ for (INSTRUMENTINDEX i = 1; i <= m_SndFile.m_nInstruments; i++)
{
m_SndFile.DestroyInstrument(i,removeSamples);
}
@@ -1453,7 +1453,7 @@
CHAR s[512];
UINT nRemoved = 0;
UINT nSwap, nIndex;
- BOOL bReorg = FALSE;
+ bool bReorg = false;
if (!m_SndFile.m_nInstruments) return FALSE;
@@ -1469,7 +1469,7 @@
BeginWaitCursor();
memset(usedmap, 0, sizeof(usedmap));
- for (UINT i=m_SndFile.m_nInstruments; i>=1; i--)
+ for(INSTRUMENTINDEX i = m_SndFile.m_nInstruments; i >= 1; i--)
{
if (!m_SndFile.IsInstrumentUsed(i))
{
@@ -1477,9 +1477,9 @@
// -> CODE#0003
// -> DESC="remove instrument's samples"
// m_SndFile.DestroyInstrument(i);
- m_SndFile.DestroyInstrument(i,removeSamples);
+ m_SndFile.DestroyInstrument(i, removeSamples);
// -! BEHAVIOUR_CHANGE#0003
- if ((i == m_SndFile.m_nInstruments) && (i>1)) m_SndFile.m_nInstruments--; else bReorg = TRUE;
+ if ((i == m_SndFile.m_nInstruments) && (i>1)) m_SndFile.m_nInstruments--; else bReorg = true;
END_CRITICAL();
nRemoved++;
} else
@@ -1701,8 +1701,8 @@
SAMPLEINDEX CModDoc::InsertSample(bool bLimit)
//--------------------------------------------
{
- UINT i = 1;
- for (i=1; i<=m_SndFile.m_nSamples; i++)
+ SAMPLEINDEX i = 1;
+ for(i = 1; i <= m_SndFile.m_nSamples; i++)
{
if ((!m_SndFile.m_szNames[i][0]) && (m_SndFile.Samples[i].pSample == NULL))
{
@@ -1802,7 +1802,7 @@
} else
if (!pDup)
{
- for (UINT k=1; k<=m_SndFile.m_nSamples; k++)
+ for(SAMPLEINDEX k = 1; k <= m_SndFile.m_nSamples; k++)
{
if (!m_SndFile.IsSampleUsed(k))
{
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -1614,6 +1614,11 @@
//------------------------------------------------
{
CModDoc *pModDoc = GetDocument();
+ if(pModDoc == nullptr) return;
+ CSoundFile *pSndFile = pModDoc->GetSoundFile();
+ if(pSndFile == nullptr) return;
+ MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
+
BOOL bSplitCursor = FALSE;
CHAR s[256];
@@ -1632,7 +1637,7 @@
if (nVal > 64) nVal = 64;
if (nTick < 0) nTick = 0;
if (nTick <= EnvGetReleaseNodeTick() + 1 || EnvGetReleaseNode() == ENV_RELEASE_NODE_UNSET) {
- int displayVal = (m_nEnv != ENV_VOLUME) ? nVal-32 : nVal;
+ int displayVal = (m_nEnv != ENV_VOLUME && !(m_nEnv == ENV_PITCH && (pIns->dwFlags & ENV_FILTER))) ? nVal - 32 : nVal;
wsprintf(s, "Tick %d, [%d]", nTick, displayVal);
} else {
int displayVal = (nVal - EnvGetReleaseNodeValue()) * 2;
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -3542,15 +3542,15 @@
case kcNextPattern: { UINT n = m_nPattern + 1;
while ((n < pSndFile->Patterns.Size()) && (!pSndFile->Patterns[n])) n++;
SetCurrentPattern((n < pSndFile->Patterns.Size()) ? n : 0);
- int currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER);
- int newOrder = pSndFile->FindOrder(m_nPattern, currentOrder, true);
+ ORDERINDEX currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER);
+ ORDERINDEX newOrder = pSndFile->FindOrder(m_nPattern, currentOrder, true);
SendCtrlMessage(CTRLMSG_SETCURRENTORDER, newOrder);
return wParam; }
case kcPrevPattern: { UINT n = (m_nPattern) ? m_nPattern - 1 : pSndFile->Patterns.Size()-1;
while ((n > 0) && (!pSndFile->Patterns[n])) n--;
SetCurrentPattern(n);
- int currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER);
- int newOrder = pSndFile->FindOrder(m_nPattern, currentOrder, false);
+ ORDERINDEX currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER);
+ ORDERINDEX newOrder = pSndFile->FindOrder(m_nPattern, currentOrder, false);
SendCtrlMessage(CTRLMSG_SETCURRENTORDER, newOrder);
return wParam; }
case kcSelectWithCopySelect:
Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -1799,6 +1799,11 @@
BOOL CMidiMacroSetup::OnInitDialog()
//----------------------------------
{
+ m_pModDoc = CMainFrame::GetMainFrame()->GetActiveDoc();
+ if (m_pModDoc) m_pSndFile = CMainFrame::GetMainFrame()->GetActiveDoc()->GetSoundFile();
+ if (!m_pSndFile)
+ return FALSE;
+
CHAR s[128];
CDialog::OnInitDialog();
CheckDlgButton(IDC_CHECK1, m_bEmbed);
@@ -1837,7 +1842,7 @@
m_CbnZxxPreset.AddString("Z80-ZFF controls cutoff");
m_CbnZxxPreset.AddString("Z80-ZFF controls filter mode");
m_CbnZxxPreset.AddString("Z80-Z9F controls resonance+mode");
- m_CbnZxxPreset.SetCurSel(0);
+ m_CbnZxxPreset.SetCurSel(m_pModDoc->GetZxxType(m_MidiCfg.szMidiZXXExt));
UpdateDialog();
int offsetx=108, offsety=30, separatorx=4, separatory=2,
@@ -1863,10 +1868,6 @@
}
UpdateMacroList();
- m_pModDoc = CMainFrame::GetMainFrame()->GetActiveDoc();
- if (m_pModDoc) m_pSndFile = CMainFrame::GetMainFrame()->GetActiveDoc()->GetSoundFile();
- if (!m_pSndFile)
- return FALSE;
for (UINT plug=0; plug<MAX_MIXPLUGINS; plug++)
{
PSNDMIXPLUGIN p = &(m_pSndFile->m_MixPlugins[plug]);
@@ -2034,39 +2035,10 @@
{
UINT zxx_preset = m_CbnZxxPreset.GetCurSel();
- if (zxx_preset)
+ if (zxx_preset && m_pModDoc != nullptr)
{
- BeginWaitCursor();
- for (UINT i=0; i<128; i++)
- {
- switch(zxx_preset)
- {
- case 1:
- if (i<16) wsprintf(&m_MidiCfg.szMidiZXXExt[i*32], "F0F001%02X", i*8);
- else m_MidiCfg.szMidiZXXExt[i*32] = 0;
- break;
-
- case 2:
- wsprintf(&m_MidiCfg.szMidiZXXExt[i*32], "F0F001%02X", i);
- break;
-
- case 3:
- wsprintf(&m_MidiCfg.szMidiZXXExt[i*32], "F0F000%02X", i);
- break;
-
- case 4:
- wsprintf(&m_MidiCfg.szMidiZXXExt[i*32], "F0F002%02X", i);
- break;
-
- case 5:
- if (i<16) wsprintf(&m_MidiCfg.szMidiZXXExt[i*32], "F0F001%02X", i*8);
- else if (i<32) wsprintf(&m_MidiCfg.szMidiZXXExt[i*32], "F0F002%02X", (i-16)*8);
- else m_MidiCfg.szMidiZXXExt[i*32] = 0;
- break;
- }
- }
+ m_pModDoc->CreateZxxFromType(m_MidiCfg.szMidiZXXExt, zxx_preset);
UpdateDialog();
- EndWaitCursor();
}
}
Modified: trunk/OpenMPT/mptrack/misc_util.h
===================================================================
--- trunk/OpenMPT/mptrack/misc_util.h 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/misc_util.h 2009-09-15 17:15:29 UTC (rev 364)
@@ -110,4 +110,29 @@
utilImpl::ArrayCopyImpl<std::tr1::has_trivial_assign<T>::value>::Do(pDst, pSrc, n);
}
+// Sanitize a filename (remove special chars)
+template <size_t size>
+inline void SanitizeFilename(char (&buffer)[size])
+{
+ STATIC_ASSERT(size > 0);
+ for(int i = 0; i < size; i++)
+ {
+ if( buffer[i] == '\\' ||
+ buffer[i] == '\"' ||
+ buffer[i] == '/' ||
+ buffer[i] == ':' ||
+ buffer[i] == '?' ||
+ buffer[i] == '<' ||
+ buffer[i] == '>' ||
+ buffer[i] == '*')
+ {
+ for(int j = i + 1; j < size; j++)
+ {
+ buffer[j - 1] = buffer[j];
+ }
+ buffer[size - 1] = 0;
+ }
+ }
+}
+
#endif
Modified: trunk/OpenMPT/mptrack/mod2midi.cpp
===================================================================
--- trunk/OpenMPT/mptrack/mod2midi.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/mptrack/mod2midi.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -167,7 +167,7 @@
m_nCurrInstr = 1;
if (m_pSndFile->m_nInstruments)
{
- for (UINT nIns=1; nIns<=m_pSndFile->m_nInstruments; nIns++)
+ for(INSTRUMENTINDEX nIns = 1; nIns <= m_pSndFile->m_nInstruments; nIns++)
{
MODINSTRUMENT *pIns = m_pSndFile->Instruments[nIns];
if ((pIns) && (m_pSndFile->IsInstrumentUsed(nIns)))
@@ -180,15 +180,15 @@
}
} else
{
- for (UINT nIns=1; nIns<=m_pSndFile->m_nSamples; nIns++)
+ for(SAMPLEINDEX nSmp = 1; nSmp <= m_pSndFile->m_nSamples; nSmp++)
{
- if ((m_pSndFile->Samples[nIns].pSample)
- && (m_pSndFile->IsSampleUsed(nIns)))
+ if ((m_pSndFile->Samples[nSmp].pSample)
+ && (m_pSndFile->IsSampleUsed(nSmp)))
{
memset(s, 0, sizeof(s));
- wsprintf(s, "%02d: ", nIns);
- memcpy(s+strlen(s), m_pSndFile->m_szNames[nIns], 32);
- m_CbnInstrument.SetItemData(m_CbnInstrument.AddString(s), nIns);
+ wsprintf(s, "%02d: ", nSmp);
+ memcpy(s+strlen(s), m_pSndFile->m_szNames[nSmp], 32);
+ m_CbnInstrument.SetItemData(m_CbnInstrument.AddString(s), nSmp);
}
}
}
Modified: trunk/OpenMPT/soundlib/Sampleio.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -14,10 +14,10 @@
#pragma warning(disable:4244)
-BOOL CSoundFile::ReadSampleFromFile(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength)
-//-------------------------------------------------------------------------------------
+bool CSoundFile::ReadSampleFromFile(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength)
+//--------------------------------------------------------------------------------------------
{
- if ((!nSample) || (nSample >= MAX_SAMPLES)) return FALSE;
+ if ((!nSample) || (nSample >= MAX_SAMPLES)) return false;
if ((!ReadWAVSample(nSample, lpMemFile, dwFileLength))
&& (!ReadXISample(nSample, lpMemFile, dwFileLength))
&& (!ReadAIFFSample(nSample, lpMemFile, dwFileLength))
@@ -25,30 +25,30 @@
&& (!ReadPATSample(nSample, lpMemFile, dwFileLength))
&& (!Read8SVXSample(nSample, lpMemFile, dwFileLength))
&& (!ReadS3ISample(nSample, lpMemFile, dwFileLength)))
- return FALSE;
- return TRUE;
+ return false;
+ return true;
}
-BOOL CSoundFile::ReadInstrumentFromFile(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
-//----------------------------------------------------------------------------------------
+bool CSoundFile::ReadInstrumentFromFile(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
+//---------------------------------------------------------------------------------------------------
{
- if ((!nInstr) || (nInstr >= MAX_INSTRUMENTS)) return FALSE;
+ if ((!nInstr) || (nInstr >= MAX_INSTRUMENTS)) return false;
if ((!ReadXIInstrument(nInstr, lpMemFile, dwFileLength))
&& (!ReadPATInstrument(nInstr, lpMemFile, dwFileLength))
&& (!ReadITIInstrument(nInstr, lpMemFile, dwFileLength))
// Generic read
- && (!ReadSampleAsInstrument(nInstr, lpMemFile, dwFileLength))) return FALSE;
+ && (!ReadSampleAsInstrument(nInstr, lpMemFile, dwFileLength))) return false;
if (nInstr > m_nInstruments) m_nInstruments = nInstr;
- return TRUE;
+ return true;
}
-BOOL CSoundFile::ReadSampleAsInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
-//----------------------------------------------------------------------------------------
+bool CSoundFile::ReadSampleAsInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
+//---------------------------------------------------------------------------------------------------
{
LPDWORD psig = (LPDWORD)lpMemFile;
- if ((!lpMemFile) || (dwFileLength < 128)) return FALSE;
+ if ((!lpMemFile) || (dwFileLength < 128)) return false;
if (((psig[0] == 0x46464952) && (psig[2] == 0x45564157)) // RIFF....WAVE signature
|| ((psig[0] == 0x5453494C) && (psig[2] == 0x65766177)) // LIST....wave
|| (psig[76/4] == 0x53524353) // S3I signature
@@ -59,7 +59,7 @@
{
// Loading Instrument
MODINSTRUMENT *pIns = new MODINSTRUMENT;
- if (!pIns) return FALSE;
+ if (!pIns) return false;
memset(pIns, 0, sizeof(MODINSTRUMENT));
pIns->pTuning = pIns->s_DefaultTuning;
// -> CODE#0003
@@ -91,21 +91,20 @@
pIns->NoteMap[iinit] = iinit+1;
}
if (nSample) ReadSampleFromFile(nSample, lpMemFile, dwFileLength);
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
// -> CODE#0003
// -> DESC="remove instrument's samples"
// BOOL CSoundFile::DestroyInstrument(UINT nInstr)
-BOOL CSoundFile::DestroyInstrument(UINT nInstr, char removeSamples)
-// -! BEHAVIOUR_CHANGE#0003
-//---------------------------------------------
+bool CSoundFile::DestroyInstrument(INSTRUMENTINDEX nInstr, char removeSamples)
+//----------------------------------------------------------------------------
{
- if ((!nInstr) || (nInstr > m_nInstruments)) return FALSE;
- if (!Instruments[nInstr]) return TRUE;
+ if ((!nInstr) || (nInstr > m_nInstruments)) return false;
+ if (!Instruments[nInstr]) return true;
// -> CODE#0003
// -> DESC="remove instrument's samples"
@@ -117,7 +116,7 @@
// -> CODE#0023
// -> DESC="IT project files (.itp)"
m_szInstrumentPath[nInstr-1][0] = '\0';
- instrumentModified[nInstr-1] = FALSE;
+ instrumentModified[nInstr-1] = false;
// -! NEW_FEATURE#0023
MODINSTRUMENT *pIns = Instruments[nInstr];
@@ -130,14 +129,14 @@
}
}
delete pIns;
- return TRUE;
+ return true;
}
-BOOL CSoundFile::IsSampleUsed(UINT nSample)
-//-----------------------------------------
+bool CSoundFile::IsSampleUsed(SAMPLEINDEX nSample)
+//------------------------------------------------
{
- if ((!nSample) || (nSample > m_nSamples)) return FALSE;
+ if ((!nSample) || (nSample > m_nSamples)) return false;
if (m_nInstruments)
{
for (UINT i=1; i<=m_nInstruments; i++) if (Instruments[i])
@@ -145,7 +144,7 @@
MODINSTRUMENT *pIns = Instruments[i];
for (UINT j=0; j<128; j++)
{
- if (pIns->Keyboard[j] == nSample) return TRUE;
+ if (pIns->Keyboard[j] == nSample) return true;
}
}
} else
@@ -155,33 +154,33 @@
MODCOMMAND *m = Patterns[i];
for (UINT j=m_nChannels*PatternSize[i]; j; m++, j--)
{
- if (m->instr == nSample) return TRUE;
+ if (m->instr == nSample) return true;
}
}
}
- return FALSE;
+ return false;
}
-BOOL CSoundFile::IsInstrumentUsed(UINT nInstr)
-//--------------------------------------------
+bool CSoundFile::IsInstrumentUsed(INSTRUMENTINDEX nInstr)
+//-------------------------------------------------------
{
- if ((!nInstr) || (nInstr > m_nInstruments) || (!Instruments[nInstr])) return FALSE;
+ if ((!nInstr) || (nInstr > m_nInstruments) || (!Instruments[nInstr])) return false;
for (UINT i=0; i<Patterns.Size(); i++) if (Patterns[i])
{
MODCOMMAND *m = Patterns[i];
for (UINT j=m_nChannels*PatternSize[i]; j; m++, j--)
{
- if (m->instr == nInstr) return TRUE;
+ if (m->instr == nInstr) return true;
}
}
- return FALSE;
+ return false;
}
// Removing all unused samples
-BOOL CSoundFile::RemoveInstrumentSamples(UINT nInstr)
-//---------------------------------------------------
+bool CSoundFile::RemoveInstrumentSamples(INSTRUMENTINDEX nInstr)
+//--------------------------------------------------------------
{
BYTE sampleused[MAX_SAMPLES/8];
@@ -194,23 +193,23 @@
UINT n = p->Keyboard[r];
if (n < MAX_SAMPLES) sampleused[n>>3] |= (1<<(n&7));
}
- for (UINT smp=1; smp<MAX_INSTRUMENTS; smp++) if ((Instruments[smp]) && (smp != nInstr))
+ for (SAMPLEINDEX nSmp=1; nSmp<MAX_INSTRUMENTS; nSmp++) if ((Instruments[nSmp]) && (nSmp != nInstr))
{
- p = Instruments[smp];
+ p = Instruments[nSmp];
for (UINT r=0; r<128; r++)
{
UINT n = p->Keyboard[r];
if (n < MAX_SAMPLES) sampleused[n>>3] &= ~(1<<(n&7));
}
}
- for (UINT d=1; d<=m_nSamples; d++) if (sampleused[d>>3] & (1<<(d&7)))
+ for (SAMPLEINDEX d = 1; d <= m_nSamples; d++) if (sampleused[d>>3] & (1<<(d&7)))
{
DestroySample(d);
m_szNames[d][0] = 0;
}
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
////////////////////////////////////////////////////////////////////////////////
@@ -218,11 +217,11 @@
// I/O From another song
//
-BOOL CSoundFile::ReadInstrumentFromSong(UINT nInstr, CSoundFile *pSrcSong, UINT nSrcInstr)
-//----------------------------------------------------------------------------------------
+bool CSoundFile::ReadInstrumentFromSong(INSTRUMENTINDEX nInstr, CSoundFile *pSrcSong, UINT nSrcInstr)
+//---------------------------------------------------------------------------------------------------
{
if ((!pSrcSong) || (!nSrcInstr) || (nSrcInstr > pSrcSong->m_nInstruments)
- || (nInstr >= MAX_INSTRUMENTS) || (!pSrcSong->Instruments[nSrcInstr])) return FALSE;
+ || (nInstr >= MAX_INSTRUMENTS) || (!pSrcSong->Instruments[nSrcInstr])) return false;
if (m_nInstruments < nInstr) m_nInstruments = nInstr;
// -> CODE#0003
// -> DESC="remove instrument's samples"
@@ -277,16 +276,16 @@
{
ReadSampleFromSong(samplemap[k], pSrcSong, samplesrc[k]);
}
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
-BOOL CSoundFile::ReadSampleFromSong(UINT nSample, CSoundFile *pSrcSong, UINT nSrcSample)
-//--------------------------------------------------------------------------------------
+bool CSoundFile::ReadSampleFromSong(SAMPLEINDEX nSample, CSoundFile *pSrcSong, UINT nSrcSample)
+//---------------------------------------------------------------------------------------------
{
- if ((!pSrcSong) || (!nSrcSample) || (nSrcSample > pSrcSong->m_nSamples) || (nSample >= MAX_SAMPLES)) return FALSE;
+ if ((!pSrcSong) || (!nSrcSample) || (nSrcSample > pSrcSong->m_nSamples) || (nSample >= MAX_SAMPLES)) return false;
MODSAMPLE *psmp = &pSrcSong->Samples[nSrcSample];
UINT nSize = psmp->nLength;
if (psmp->uFlags & CHN_16BIT) nSize *= 2;
@@ -318,7 +317,7 @@
{
FrequencyToTranspose(&Samples[nSample]);
}
- return TRUE;
+ return true;
}
@@ -330,8 +329,8 @@
extern BOOL IMAADPCMUnpack16(signed short *pdest, UINT nLen, LPBYTE psrc, DWORD dwBytes, UINT pkBlkAlign);
-BOOL CSoundFile::ReadWAVSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD *pdwWSMPOffset)
-//------------------------------------------------------------------------------------------------------
+bool CSoundFile::ReadWAVSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD *pdwWSMPOffset)
+//-------------------------------------------------------------------------------------------------------------
{
DWORD dwMemPos = 0, dwDataPos;
WAVEFILEHEADER *phdr = (WAVEFILEHEADER *)lpMemFile;
@@ -341,9 +340,9 @@
WAVEEXTRAHEADER *pxh;
DWORD dwInfoList, dwFact, dwSamplesPerBlock;
- if ((!nSample) || (!lpMemFile) || (dwFileLength < (DWORD)(sizeof(WAVEFILEHEADER)+sizeof(WAVEFORMATHEADER)))) return FALSE;
+ if ((!nSample) || (!lpMemFile) || (dwFileLength < (DWORD)(sizeof(WAVEFILEHEADER)+sizeof(WAVEFORMATHEADER)))) return false;
if (((phdr->id_RIFF != IFFID_RIFF) && (phdr->id_RIFF != IFFID_LIST))
- || ((phdr->id_WAVE != IFFID_WAVE) && (phdr->id_WAVE != IFFID_wave))) return FALSE;
+ || ((phdr->id_WAVE != IFFID_WAVE) && (phdr->id_WAVE != IFFID_wave))) return false;
dwMemPos = sizeof(WAVEFILEHEADER);
dwDataPos = 0;
pfmt = NULL;
@@ -410,7 +409,7 @@
}
dwMemPos += dwLen + 8;
}
- if ((!pdata) || (!pfmt) || (pdata->length < 4)) return FALSE;
+ if ((!pdata) || (!pfmt) || (pdata->length < 4)) return false;
if ((pfmtpk) && (pfmt))
{
if (pfmt->format != 1)
@@ -419,7 +418,7 @@
pfmt = pfmtpk;
pfmtpk = tmp;
if ((pfmtpk->format != 0x11) || (pfmtpk->bitspersample != 4)
- || (pfmtpk->channels != 1)) return FALSE;
+ || (pfmtpk->channels != 1)) return false;
} else pfmtpk = NULL;
}
// WAVE_FORMAT_PCM, WAVE_FORMAT_IEEE_FLOAT, WAVE_FORMAT_EXTENSIBLE
@@ -430,7 +429,7 @@
|| (pfmt->bitspersample & 7)
|| (!pfmt->bitspersample)
|| (pfmt->bitspersample > 32)
- ) return FALSE;
+ ) return false;
DestroySample(nSample);
UINT nType = RS_PCM8U;
@@ -570,14 +569,14 @@
}
}
}
- return TRUE;
+ return true;
}
///////////////////////////////////////////////////////////////
// Save WAV
-BOOL CSoundFile::SaveWAVSample(UINT nSample, LPCSTR lpszFileName)
+bool CSoundFile::SaveWAVSample(UINT nSample, LPCSTR lpszFileName)
//---------------------------------------------------------------
{
LPCSTR lpszMPT = "Modplug Tracker\0";
@@ -590,7 +589,7 @@
MODSAMPLE *pSmp = &Samples[nSample];
FILE *f;
- if ((f = fopen(lpszFileName, "wb")) == NULL) return FALSE;
+ if ((f = fopen(lpszFileName, "wb")) == NULL) return false;
memset(&extra, 0, sizeof(extra));
memset(&smpl, 0, sizeof(smpl));
header.id_RIFF = IFFID_RIFF;
@@ -679,19 +678,19 @@
extra.nVibRate = pSmp->nVibRate;
fwrite(&extra, 1, sizeof(extra), f);
fclose(f);
- return TRUE;
+ return true;
}
///////////////////////////////////////////////////////////////
// Save RAW
-BOOL CSoundFile::SaveRAWSample(UINT nSample, LPCSTR lpszFileName)
+bool CSoundFile::SaveRAWSample(UINT nSample, LPCSTR lpszFileName)
//---------------------------------------------------------------
{
MODSAMPLE *pSmp = &Samples[nSample];
FILE *f;
- if ((f = fopen(lpszFileName, "wb")) == NULL) return FALSE;
+ if ((f = fopen(lpszFileName, "wb")) == NULL) return false;
UINT nType;
if (pSmp->uFlags & CHN_STEREO)
@@ -700,7 +699,7 @@
nType = (pSmp->uFlags & CHN_16BIT) ? RS_PCM16S : RS_PCM8S;
WriteSample(f, pSmp, nType);
fclose(f);
- return TRUE;
+ return true;
}
/////////////////////////////////////////////////////////////
@@ -867,8 +866,8 @@
}
-BOOL CSoundFile::ReadPATSample(UINT nSample, LPBYTE lpStream, DWORD dwMemLength)
-//------------------------------------------------------------------------------
+bool CSoundFile::ReadPATSample(SAMPLEINDEX nSample, LPBYTE lpStream, DWORD dwMemLength)
+//-------------------------------------------------------------------------------------
{
DWORD dwMemPos = sizeof(GF1PATCHFILEHEADER)+sizeof(GF1INSTRUMENT)+sizeof(GF1LAYER);
GF1PATCHFILEHEADER *phdr = (GF1PATCHFILEHEADER *)lpStream;
@@ -877,7 +876,7 @@
if ((!lpStream) || (dwMemLength < 512)
|| (phdr->gf1p != 0x50314647) || (phdr->atch != 0x48435441)
|| (phdr->version[3] != 0) || (phdr->id[9] != 0) || (phdr->instrum < 1)
- || (!phdr->samples) || (!pinshdr->layers)) return FALSE;
+ || (!phdr->samples) || (!pinshdr->layers)) return false;
DestroySample(nSample);
PatchToSample(this, nSample, lpStream+dwMemPos, dwMemLength-dwMemPos);
if (pinshdr->name[0] > ' ')
@@ -885,13 +884,13 @@
memcpy(m_szNames[nSample], pinshdr->name, 16);
m_szNames[nSample][16] = 0;
}
- return TRUE;
+ return true;
}
// PAT Instrument
-BOOL CSoundFile::ReadPATInstrument(UINT nInstr, LPBYTE lpStream, DWORD dwMemLength)
-//---------------------------------------------------------------------------------
+bool CSoundFile::ReadPATInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpStream, DWORD dwMemLength)
+//--------------------------------------------------------------------------------------------
{
GF1PATCHFILEHEADER *phdr = (GF1PATCHFILEHEADER *)lpStream;
GF1INSTRUMENT *pih = (GF1INSTRUMENT *)(lpStream+sizeof(GF1PATCHFILEHEADER));
@@ -904,7 +903,7 @@
|| (phdr->gf1p != 0x50314647) || (phdr->atch != 0x48435441)
|| (phdr->version[3] != 0) || (phdr->id[9] != 0)
|| (phdr->instrum < 1) || (!phdr->samples)
- || (!pih->layers) || (!plh->samples)) return FALSE;
+ || (!pih->layers) || (!plh->samples)) return false;
if (nInstr > m_nInstruments) m_nInstruments = nInstr;
// -> CODE#0003
// -> DESC="remove instrument's samples"
@@ -912,7 +911,7 @@
DestroyInstrument(nInstr,1);
// -! BEHAVIOUR_CHANGE#0003
pIns = new MODINSTRUMENT;
- if (!pIns) return FALSE;
+ if (!pIns) return false;
memset(pIns, 0, sizeof(MODINSTRUMENT));
pIns->pTuning = pIns->s_DefaultTuning;
Instruments[nInstr] = pIns;
@@ -1004,7 +1003,7 @@
}
}
}
- return TRUE;
+ return true;
}
@@ -1032,8 +1031,8 @@
DWORD scrs;
} S3ISAMPLESTRUCT;
-BOOL CSoundFile::ReadS3ISample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength)
-//--------------------------------------------------------------------------------
+bool CSoundFile::ReadS3ISample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength)
+//---------------------------------------------------------------------------------------
{
S3ISAMPLESTRUCT *pss = (S3ISAMPLESTRUCT *)lpMemFile;
MODSAMPLE *pSmp = &Samples[nSample];
@@ -1042,7 +1041,7 @@
if ((!lpMemFile) || (dwFileLength < sizeof(S3ISAMPLESTRUCT))
|| (pss->id != 0x01) || (((DWORD)pss->offset << 4) >= dwFileLength)
- || (pss->scrs != 0x53524353)) return FALSE;
+ || (pss->scrs != 0x53524353)) return false;
DestroySample(nSample);
dwMemPos = pss->offset << 4;
memcpy(pSmp->filename, pss->filename, 12);
@@ -1063,7 +1062,7 @@
flags = (pss->flags & 0x04) ? RS_PCM16U : RS_PCM8U;
if (pss->flags & 0x02) flags |= RSF_STEREO;
ReadSample(pSmp, flags, (LPSTR)(lpMemFile+dwMemPos), dwFileLength-dwMemPos);
- return TRUE;
+ return true;
}
@@ -1112,8 +1111,8 @@
-BOOL CSoundFile::ReadXIInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
-//----------------------------------------------------------------------------------
+bool CSoundFile::ReadXIInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
+//---------------------------------------------------------------------------------------------
{
XIFILEHEADER *pxh = (XIFILEHEADER *)lpMemFile;
XIINSTRUMENTHEADER *pih = (XIINSTRUMENTHEADER *)(lpMemFile+sizeof(XIFILEHEADER));
@@ -1123,11 +1122,11 @@
DWORD dwMemPos = sizeof(XIFILEHEADER)+sizeof(XIINSTRUMENTHEADER);
UINT nsamples;
- if ((!lpMemFile) || (dwFileLength < sizeof(XIFILEHEADER)+sizeof(XIINSTRUMENTHEADER))) return FALSE;
- if (dwMemPos + pxh->shsize - 0x102 >= dwFileLength) return FALSE;
- if (memcmp(pxh->extxi, "Extended Instrument", 19)) return FALSE;
+ if ((!lpMemFile) || (dwFileLength < sizeof(XIFILEHEADER)+sizeof(XIINSTRUMENTHEADER))) return false;
+ if (dwMemPos + pxh->shsize - 0x102 >= dwFileLength) return false;
+ if (memcmp(pxh->extxi, "Extended Instrument", 19)) return false;
dwMemPos += pxh->shsize - 0x102;
- if ((dwMemPos < sizeof(XIFILEHEADER)) || (dwMemPos >= dwFileLength)) return FALSE;
+ if ((dwMemPos < sizeof(XIFILEHEADER)) || (dwMemPos >= dwFileLength)) return false;
if (nInstr > m_nInstruments) m_nInstruments = nInstr;
// -> CODE#0003
// -> DESC="remove instrument's samples"
@@ -1136,7 +1135,7 @@
// -! BEHAVIOUR_CHANGE#0003
Instruments[nInstr] = new MODINSTRUMENT;
MODINSTRUMENT *pIns = Instruments[nInstr];
- if (!pIns) return FALSE;
+ if (!pIns) return false;
memset(pIns, 0, sizeof(MODINSTRUMENT));
pIns->pTuning = pIns->s_DefaultTuning;
memcpy(pIns->name, pxh->name, 22);
@@ -1295,18 +1294,18 @@
// -> DESC="per-instrument volume ramping setup (refered as attack)"
// Leave if no extra instrument settings are available (end of file reached)
- if(dwMemPos >= dwFileLength) return TRUE;
+ if(dwMemPos >= dwFileLength) return true;
ReadExtendedInstrumentProperties(pIns, lpMemFile + dwMemPos, dwFileLength - dwMemPos);
// -! NEW_FEATURE#0027
- return TRUE;
+ return true;
}
-BOOL CSoundFile::SaveXIInstrument(UINT nInstr, LPCSTR lpszFileName)
-//-----------------------------------------------------------------
+bool CSoundFile::SaveXIInstrument(INSTRUMENTINDEX nInstr, LPCSTR lpszFileName)
+//----------------------------------------------------------------------------
{
XIFILEHEADER xfh;
XIINSTRUMENTHEADER xih;
@@ -1316,8 +1315,8 @@
UINT nsamples;
FILE *f;
- if ((!pIns) || (!lpszFileName)) return FALSE;
- if ((f = fopen(lpszFileName, "wb")) == NULL) return FALSE;
+ if ((!pIns) || (!lpszFileName)) return false;
+ if ((f = fopen(lpszFileName, "wb")) == NULL) return false;
// XI File Header
memset(&xfh, 0, sizeof(xfh));
memset(&xih, 0, sizeof(xih));
@@ -1431,12 +1430,12 @@
fclose(f);
- return TRUE;
+ return true;
}
-BOOL CSoundFile::ReadXISample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength)
-//-------------------------------------------------------------------------------
+bool CSoundFile::ReadXISample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength)
+//--------------------------------------------------------------------------------------
{
XIFILEHEADER *pxh = (XIFILEHEADER *)lpMemFile;
XIINSTRUMENTHEADER *pih = (XIINSTRUMENTHEADER *)(lpMemFile+sizeof(XIFILEHEADER));
@@ -1445,10 +1444,10 @@
MODSAMPLE *pSmp = &Samples[nSample];
UINT nsamples;
- if ((!lpMemFile) || (dwFileLength < sizeof(XIFILEHEADER)+sizeof(XIINSTRUMENTHEADER))) return FALSE;
- if (memcmp(pxh->extxi, "Extended Instrument", 19)) return FALSE;
+ if ((!lpMemFile) || (dwFileLength < sizeof(XIFILEHEADER)+sizeof(XIINSTRUMENTHEADER))) return false;
+ if (memcmp(pxh->extxi, "Extended Instrument", 19)) return false;
dwMemPos += pxh->shsize - 0x102;
- if ((dwMemPos < sizeof(XIFILEHEADER)) || (dwMemPos >= dwFileLength)) return FALSE;
+ if ((dwMemPos < sizeof(XIFILEHEADER)) || (dwMemPos >= dwFileLength)) return false;
DestroySample(nSample);
nsamples = 0;
for (UINT i=0; i<96; i++)
@@ -1516,9 +1515,9 @@
memcpy(pSmp->filename, psh->name, 22);
pSmp->filename[21] = 0;
}
- if (dwMemPos >= dwFileLength) return TRUE;
+ if (dwMemPos >= dwFileLength) return true;
ReadSample(pSmp, sampleflags, (LPSTR)(lpMemFile+dwMemPos), dwFileLength-dwMemPos);
- return TRUE;
+ return true;
}
@@ -1580,8 +1579,8 @@
-BOOL CSoundFile::ReadAIFFSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength)
-//---------------------------------------------------------------------------------
+bool CSoundFile::ReadAIFFSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength)
+//----------------------------------------------------------------------------------------
{
DWORD dwMemPos = sizeof(AIFFFILEHEADER);
DWORD dwFORMLen, dwCOMMLen, dwSSNDLen;
@@ -1590,22 +1589,22 @@
AIFFSSND *psnd;
UINT nType;
- if ((!lpMemFile) || (dwFileLength < (DWORD)sizeof(AIFFFILEHEADER))) return FALSE;
+ if ((!lpMemFile) || (dwFileLength < (DWORD)sizeof(AIFFFILEHEADER))) return false;
dwFORMLen = BigEndian(phdr->dwLen);
if ((phdr->dwFORM != 0x4D524F46) || (phdr->dwAIFF != 0x46464941)
- || (dwFORMLen > dwFileLength) || (dwFORMLen < (DWORD)sizeof(AIFFCOMM))) return FALSE;
+ || (dwFORMLen > dwFileLength) || (dwFORMLen < (DWORD)sizeof(AIFFCOMM))) return false;
pcomm = (AIFFCOMM *)(lpMemFile+dwMemPos);
dwCOMMLen = BigEndian(pcomm->dwLen);
- if ((pcomm->dwCOMM != 0x4D4D4F43) || (dwCOMMLen < 0x12) || (dwCOMMLen >= dwFileLength)) return FALSE;
- if ((pcomm->wChannels != 0x0100) && (pcomm->wChannels != 0x0200)) return FALSE;
- if ((pcomm->wSampleSize != 0x0800) && (pcomm->wSampleSize != 0x1000)) return FALSE;
+ if ((pcomm->dwCOMM != 0x4D4D4F43) || (dwCOMMLen < 0x12) || (dwCOMMLen >= dwFileLength)) return false;
+ if ((pcomm->wChannels != 0x0100) && (pcomm->wChannels != 0x0200)) return false;
+ if ((pcomm->wSampleSize != 0x0800) && (pcomm->wSampleSize != 0x1000)) return false;
dwMemPos += dwCOMMLen + 8;
- if (dwMemPos + sizeof(AIFFSSND) >= dwFileLength) return FALSE;
+ if (dwMemPos + sizeof(AIFFSSND) >= dwFileLength) return false;
psnd = (AIFFSSND *)(lpMemFile+dwMemPos);
dwSSNDLen = BigEndian(psnd->dwLen);
- if ((psnd->dwSSND != 0x444E5353) || (dwSSNDLen >= dwFileLength) || (dwSSNDLen < 8)) return FALSE;
+ if ((psnd->dwSSND != 0x444E5353) || (dwSSNDLen >= dwFileLength) || (dwSSNDLen < 8)) return false;
dwMemPos += sizeof(AIFFSSND);
- if (dwMemPos >= dwFileLength) return FALSE;
+ if (dwMemPos >= dwFileLength) return false;
DestroySample(nSample);
if (pcomm->wChannels == 0x0100)
{
@@ -1641,7 +1640,7 @@
m_szNames[nSample][0] = 0;
if (pSmp->nLength > MAX_SAMPLE_LENGTH) pSmp->nLength = MAX_SAMPLE_LENGTH;
ReadSample(pSmp, nType, (LPSTR)(lpMemFile+dwMemPos), dwFileLength-dwMemPos);
- return TRUE;
+ return true;
}
@@ -1651,9 +1650,8 @@
// -> CODE#0027
// -> DESC="per-instrument volume ramping setup (refered as attack)"
//BOOL CSoundFile::ReadITSSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD dwOffset)
-UINT CSoundFile::ReadITSSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD dwOffset)
-// -! NEW_FEATURE#0027
-//------------------------------------------------------------------------------------------------
+UINT CSoundFile::ReadITSSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD dwOffset)
+//-------------------------------------------------------------------------------------------------------
{
ITSAMPLESTRUCT *pis = (ITSAMPLESTRUCT *)lpMemFile;
MODSAMPLE *pSmp = &Samples[nSample];
@@ -1728,8 +1726,8 @@
}
-BOOL CSoundFile::ReadITIInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
-//-----------------------------------------------------------------------------------
+bool CSoundFile::ReadITIInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength)
+//----------------------------------------------------------------------------------------------
{
ITINSTRUMENT *pinstr = (ITINSTRUMENT *)lpMemFile;
WORD samplemap[NOTE_MAX]; //rewbs.noSamplePerInstroLimit (120 was 64)
@@ -1737,7 +1735,7 @@
UINT nsmp, nsamples;
if ((!lpMemFile) || (dwFileLength < sizeof(ITINSTRUMENT))
- || (pinstr->id != 0x49504D49)) return FALSE;
+ || (pinstr->id != 0x49504D49)) return false;
if (nInstr > m_nInstruments) m_nInstruments = nInstr;
// -> CODE#0003
// -> DESC="remove instrument's samples"
@@ -1746,7 +1744,7 @@
// -! BEHAVIOUR_CHANGE#0003
Instruments[nInstr] = new MODINSTRUMENT;
MODINSTRUMENT *pIns = Instruments[nInstr];
- if (!pIns) return FALSE;
+ if (!pIns) return false;
memset(pIns, 0, sizeof(MODINSTRUMENT));
pIns->pTuning = pIns->s_DefaultTuning;
memset(samplemap, 0, sizeof(samplemap));
@@ -1805,18 +1803,18 @@
ITSAMPLESTRUCT *pis = (ITSAMPLESTRUCT *)ptr;
dwMemPos += pis->samplepointer - dwMemPos + lastSampleSize;
// Leave if no extra instrument settings are available (end of file reached)
- if(dwMemPos >= dwFileLength) return TRUE;
+ if(dwMemPos >= dwFileLength) return true;
ReadExtendedInstrumentProperties(pIns, lpMemFile + dwMemPos, dwFileLength - dwMemPos);
// -! NEW_FEATURE#0027
- return TRUE;
+ return true;
}
-BOOL CSoundFile::SaveITIInstrument(UINT nInstr, LPCSTR lpszFileName)
-//------------------------------------------------------------------
+bool CSoundFile::SaveITIInstrument(INSTRUMENTINDEX nInstr, LPCSTR lpszFileName)
+//-----------------------------------------------------------------------------
{
BYTE buffer[554];
ITINSTRUMENT *iti = (ITINSTRUMENT *)buffer;
@@ -1826,8 +1824,8 @@
DWORD dwPos;
FILE *f;
- if ((!pIns) || (!lpszFileName)) return FALSE;
- if ((f = fopen(lpszFileName, "wb")) == NULL) return FALSE;
+ if ((!pIns) || (!lpszFileName)) return false;
+ if ((f = fopen(lpszFileName, "wb")) == NULL) return false;
memset(buffer, 0, sizeof(buffer));
memset(smpcount, 0, sizeof(smpcount));
memset(smptable, 0, sizeof(smptable));
@@ -1999,7 +1997,7 @@
WriteInstrumentHeaderStruct(pIns, f); // Write full extended header.
fclose(f);
- return TRUE;
+ return true;
}
@@ -2112,8 +2110,8 @@
-BOOL CSoundFile::Read8SVXSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength)
-//--------------------------------------------------------------------------------
+bool CSoundFile::Read8SVXSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength)
+//---------------------------------------------------------------------------------
{
IFF8SVXFILEHEADER *pfh = (IFF8SVXFILEHEADER *)lpMemFile;
IFFVHDR *pvh = (IFFVHDR *)(lpMemFile + 12);
@@ -2122,7 +2120,7 @@
if ((!lpMemFile) || (dwFileLength < sizeof(IFFVHDR)+12) || (pfh->dwFORM != IFFID_FORM)
|| (pfh->dw8SVX != IFFID_8SVX) || (BigEndian(pfh->dwSize) >= dwFileLength)
- || (pvh->dwVHDR != IFFID_VHDR) || (BigEndian(pvh->dwSize) >= dwFileLength)) return FALSE;
+ || (pvh->dwVHDR != IFFID_VHDR) || (BigEndian(pvh->dwSize) >= dwFileLength)) return false;
DestroySample(nSample);
// Default values
pSmp->nGlobalVol = 64;
@@ -2174,7 +2172,7 @@
}
dwMemPos += dwChunkLen + 8;
}
- return TRUE;
+ return true;
}
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -3083,7 +3083,7 @@
MODCHANNEL *pChn = &Chn[nChn];
UINT nRetrigSpeed = param & 0x0F;
UINT nRetrigCount = pChn->nRetrigCount;
- BOOL bDoRetrig = FALSE;
+ bool bDoRetrig = false;
if(IsCompatibleMode(TRK_IMPULSETRACKER))
{
@@ -3095,7 +3095,7 @@
else if (!pChn->nRetrigCount || !--pChn->nRetrigCount)
{
pChn->nRetrigCount = param & 0xf;
- bDoRetrig = TRUE;
+ bDoRetrig = true;
}
}
else
@@ -3103,7 +3103,7 @@
if (m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))
{
if (!nRetrigSpeed) nRetrigSpeed = 1;
- if ((nRetrigCount) && (!(nRetrigCount % nRetrigSpeed))) bDoRetrig = TRUE;
+ if ((nRetrigCount) && (!(nRetrigCount % nRetrigSpeed))) bDoRetrig = true;
nRetrigCount++;
} else
{
@@ -3112,12 +3112,12 @@
if ((m_nTickCount) || (param & 0x100))
{
if (!realspeed) realspeed = 1;
- if ((!(param & 0x100)) && (m_nMusicSpeed) && (!(m_nTickCount % realspeed))) bDoRetrig = TRUE;
+ if ((!(param & 0x100)) && (m_nMusicSpeed) && (!(m_nTickCount % realspeed))) bDoRetrig = true;
nRetrigCount++;
} else if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) nRetrigCount = 0;
if (nRetrigCount >= realspeed)
{
- if ((m_nTickCount) || ((param & 0x100) && (!pChn->nRowNote))) bDoRetrig = TRUE;
+ if ((m_nTickCount) || ((param & 0x100) && (!pChn->nRowNote))) bDoRetrig = true;
}
}
}
@@ -3152,12 +3152,13 @@
if ((pChn->nRowInstr) && (param < 0x100)) { InstrumentChange(pChn, pChn->nRowInstr, FALSE, FALSE); bResetEnv = TRUE; }
if (param < 0x100) bResetEnv = TRUE;
}
- NoteChange(nChn, nNote, false, bResetEnv);
+ NoteChange(nChn, nNote, IsCompatibleMode(TRK_IMPULSETRACKER) ? true : false, bResetEnv);
if (m_nInstruments) {
ProcessMidiOut(nChn, pChn); //Send retrig to Midi
}
if ((m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) && (!pChn->nRowNote) && (nOldPeriod)) pChn->nPeriod = nOldPeriod;
if (!(m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))) nRetrigCount = 0;
+ if(IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nPos = pChn->nPosLo = 0;
if (offset) //rewbs.volOffset: apply offset on retrig
{
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-15 17:15:29 UTC (rev 364)
@@ -1337,10 +1337,10 @@
//m_nSeqOverride = 0;
}
-int CSoundFile::FindOrder(PATTERNINDEX pat, UINT startFromOrder, bool direction)
-//----------------------------------------------------------------------
+ORDERINDEX CSoundFile::FindOrder(PATTERNINDEX pat, UINT startFromOrder, bool direction)
+//-------------------------------------------------------------------------------------
{
- int foundAtOrder = -1;
+ int foundAtOrder = ORDERINDEX_INVALID;
int candidateOrder = 0;
for (UINT p=0; p<Order.size(); p++) {
@@ -1708,15 +1708,15 @@
}
-BOOL CSoundFile::CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result)
-//-----------------------------------------------------------------------------------
+bool CSoundFile::CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result/*=NULL*/)
+//--------------------------------------------------------------------------------------------
{
int pos, old, oldpos, besttable = 0;
DWORD dwErr, dwTotal, dwResult;
int i,j;
if (result) *result = 0;
- if ((!pSample) || (nLen < 1024)) return FALSE;
+ if ((!pSample) || (nLen < 1024)) return false;
// Try packing with different tables
dwResult = 0;
for (j=1; j<MAX_PACK_TABLES; j++)
@@ -1746,7 +1746,7 @@
{
if (dwResult > 100) *result = 100; else *result = (BYTE)dwResult;
}
- return (dwResult >= nPacking) ? TRUE : FALSE;
+ return (dwResult >= nPacking) ? true : false;
}
#endif // NO_PACKING
@@ -2743,10 +2743,10 @@
}
-BOOL CSoundFile::RemoveSelectedSamples(BOOL *pbIns)
+bool CSoundFile::RemoveSelectedSamples(bool *pbIns)
//-------------------------------------------------
{
- if (!pbIns) return FALSE;
+ if (!pbIns) return false;
for (UINT j=1; j<MAX_SAMPLES; j++)
{
if ((!pbIns[j]) && (Samples[j].pSample))
@@ -2755,15 +2755,15 @@
if ((j == m_nSamples) && (j > 1)) m_nSamples--;
}
}
- return TRUE;
+ return true;
}
-BOOL CSoundFile::DestroySample(UINT nSample)
-//------------------------------------------
+bool CSoundFile::DestroySample(SAMPLEINDEX nSample)
+//-------------------------------------------------
{
- if ((!nSample) || (nSample >= MAX_SAMPLES)) return FALSE;
- if (!Samples[nSample].pSample) return TRUE;
+ if ((!nSample) || (nSample >= MAX_SAMPLES)) return false;
+ if (!Samples[nSample].pSample) return true;
MODSAMPLE *pSmp = &Samples[nSample];
LPSTR pSample = pSmp->pSample;
pSmp->pSample = nullptr;
@@ -2778,13 +2778,13 @@
}
}
FreeSample(pSample);
- return TRUE;
+ return true;
}
// -> CODE#0020
// -> DESC="rearrange sample list"
-bool CSoundFile::MoveSample(UINT from, UINT to)
-//---------------------------------------------
+bool CSoundFile::MoveSample(SAMPLEINDEX from, SAMPLEINDEX to)
+//-----------------------------------------------------------
{
if (!from || from >= MAX_SAMPLES || !to || to >= MAX_SAMPLES) return false;
if (/*!Ins[from].pSample ||*/ Samples[to].pSample) return true;
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2009-09-13 20:41:27 UTC (rev 363)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2009-09-15 17:15:29 UTC (rev 364)
@@ -634,7 +634,7 @@
static const CModSpecifications& GetModSpecifications(const MODTYPE type);
double GetCurrentBPM() const;
- int FindOrder(PATTERNINDEX pat, UINT startFromOrder=0, bool direction=true); //rewbs.playSongFromCursor
+ ORDERINDEX FindOrder(PATTERNINDEX pat, UINT startFromOrder=0, bool direction=true); //rewbs.playSongFromCursor
void DontLoopPattern(int nPat, int nRow=0); //rewbs.playSongFromCursor
void SetCurrentPos(UINT nPos);
void SetCurrentOrder(UINT nOrder);
@@ -848,55 +848,54 @@
// Read/Write sample functions
char GetDeltaValue(char prev, UINT n) const { return (char)(prev + CompressionTable[n & 0x0F]); }
UINT PackSample(int &sample, int next);
- BOOL CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result=NULL);
+ bool CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result=NULL);
UINT ReadSample(MODSAMPLE *pSmp, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength, const WORD format = 1);
- BOOL DestroySample(UINT nSample);
+ bool DestroySample(SAMPLEINDEX nSample);
// -> CODE#0020
// -> DESC="rearrange sample list"
- bool MoveSample(UINT from,UINT to);
+ bool MoveSample(SAMPLEINDEX from, SAMPLEINDEX to);
// -! NEW_FEATURE#0020
// -> CODE#0003
// -> DESC="remove instrument's samples"
//BOOL DestroyInstrument(UINT nInstr);
- BOOL DestroyInstrument(UINT nInstr, char removeSamples = 0);
+ bool DestroyInstrument(INSTRUMENTINDEX nInstr, char removeSamples = 0);
// -! BEHAVIOUR_CHANGE#0003
- BOOL IsSampleUsed(UINT nSample);
- BOOL IsInstrumentUsed(UINT nInstr);
- BOOL RemoveInstrumentSamples(UINT nInstr);
+ bool IsSampleUsed(SAMPLEINDEX nSample);
+ bool IsInstrumentUsed(INSTRUMENTINDEX nInstr);
+ bool RemoveInstrumentSamples(INSTRUMENTINDEX nInstr);
UINT DetectUnusedSamples(BYTE *); // bitmask
- BOOL RemoveSelectedSamples(BOOL *);
+ bool RemoveSelectedSamples(bool *pbIns);
void AdjustSampleLoop(MODSAMPLE *pSmp);
// Samples file I/O
- BOOL ReadSampleFromFile(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadWAVSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD *pdwWSMPOffset=NULL);
- BOOL ReadPATSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadS3ISample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadAIFFSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadXISample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadSampleFromFile(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadWAVSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD *pdwWSMPOffset=NULL);
+ bool ReadPATSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadS3ISample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadAIFFSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadXISample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength);
// -> CODE#0027
// -> DESC="per-instrument volume ramping setup (refered as attack)"
// BOOL ReadITSSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD dwOffset=0);
- UINT ReadITSSample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD dwOffset=0);
+ UINT ReadITSSample(SAMPLEINDEX nSample, LPBYTE lpMemFile, DWORD dwFileLength, DWORD dwOffset=0);
// -! NEW_FEATURE#0027
- BOOL ReadITISample(UINT nSample, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL Read8SVXSample(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL SaveWAVSample(UINT nSample, LPCSTR lpszFileName);
- BOOL SaveRAWSample(UINT nSample, LPCSTR lpszFileName);
+ bool Read8SVXSample(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool SaveWAVSample(UINT nSample, LPCSTR lpszFileName);
+ bool SaveRAWSample(UINT nSample, LPCSTR lpszFileName);
// Instrument file I/O
- BOOL ReadInstrumentFromFile(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadXIInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadITIInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadPATInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL ReadSampleAsInstrument(UINT nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
- BOOL SaveXIInstrument(UINT nInstr, LPCSTR lpszFileName);
- BOOL SaveITIInstrument(UINT nInstr, LPCSTR lpszFileName);
+ bool ReadInstrumentFromFile(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadXIInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadITIInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadPATInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool ReadSampleAsInstrument(INSTRUMENTINDEX nInstr, LPBYTE lpMemFile, DWORD dwFileLength);
+ bool SaveXIInstrument(INSTRUMENTINDEX nInstr, LPCSTR lpszFileName);
+ bool SaveITIInstrument(INSTRUMENTINDEX nInstr, LPCSTR lpszFileName);
// I/O from another sound file
- BOOL ReadInstrumentFromSong(UINT nInstr, CSoundFile *, UINT nSrcInstrument);
- BOOL ReadSampleFromSong(UINT nSample, CSoundFile *, UINT nSrcSample);
+ bool ReadInstrumentFromSong(INSTRUMENTINDEX nInstr, CSoundFile *pSrcSong, UINT nSrcInstrument);
+ bool ReadSampleFromSong(SAMPLEINDEX nSample, CSoundFile *pSrcSong, UINT nSrcSample);
// Period/Note functions
UINT GetNoteFromPeriod(UINT period) const;
UINT GetPeriodFromNote(UINT note, int nFineTune, UINT nC5Speed) const;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-13 20:41:39
|
Revision: 363
http://modplug.svn.sourceforge.net/modplug/?rev=363&view=rev
Author: saga-games
Date: 2009-09-13 20:41:27 +0000 (Sun, 13 Sep 2009)
Log Message:
-----------
[New] Sequence Editor: Added context menu item "Render to wave", to render one ore more patterns to wave.
[New] Sample Editor: Added setting "FinetuneStep" to INI section "Sample Editor"
[Fix] Sample Editor: When using the spin control, frequency is not clamped to [2000, 96000] anymore.
[Imp] Pattern Editor: Don't reset "replace all" flag after every search
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.h
trunk/OpenMPT/mptrack/Ctrl_seq.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.h
trunk/OpenMPT/mptrack/Mod2wave.cpp
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/mod2wave.h
trunk/OpenMPT/mptrack/resource.h
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-09-13 20:41:27 UTC (rev 363)
@@ -101,6 +101,7 @@
afx_msg void OnSwitchToView();
afx_msg void OnInsertOrder();
afx_msg void OnDeleteOrder();
+ afx_msg void OnRenderOrder();
afx_msg void OnPatternProperties();
afx_msg void OnPlayerPlay();
afx_msg void OnPlayerPause();
Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-09-13 20:41:27 UTC (rev 363)
@@ -43,6 +43,7 @@
ON_COMMAND(ID_CONTROLTAB, OnSwitchToView)
ON_COMMAND(ID_ORDERLIST_INSERT, OnInsertOrder)
ON_COMMAND(ID_ORDERLIST_DELETE, OnDeleteOrder)
+ ON_COMMAND(ID_ORDERLIST_RENDER, OnRenderOrder)
ON_COMMAND(ID_PATTERN_PROPERTIES, OnPatternProperties)
ON_COMMAND(ID_PLAYER_PLAY, OnPlayerPlay)
ON_COMMAND(ID_PLAYER_PAUSE, OnPlayerPause)
@@ -831,6 +832,9 @@
AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERN_PROPERTIES, "&Properties...");
}
}
+ AppendMenu(hMenu, MF_SEPARATOR, NULL, "");
+ AppendMenu(hMenu, MF_STRING, ID_ORDERLIST_RENDER, "Render to &Wave");
+
ClientToScreen(&pt);
::TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL);
::DestroyMenu(hMenu);
@@ -939,7 +943,14 @@
}
}
+void COrderList::OnRenderOrder()
+//------------------------------
+{
+ ORD_SELECTION selection = GetCurSel(false);
+ m_pModDoc->OnFileWaveConvert(selection.nOrdLo, selection.nOrdHi);
+}
+
void COrderList::OnDeleteOrder()
//------------------------------
{
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-13 20:41:27 UTC (rev 363)
@@ -402,6 +402,9 @@
}
}
SetCurrentSample((lParam > 0) ? lParam : m_nSample);
+
+ m_nFinetuneStep = CMainFrame::GetPrivateProfileLong("Sample Editor", "FinetuneStep", 25, theApp.GetConfigFileName());
+
// Initial Update
// 05/01/05 : ericus replaced "m_nSample << 24" by "m_nSample << 20" : 4000 samples -> 12bits [see Moddoc.h]
if (!m_bInitialized) UpdateView((m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEINFO | HINT_MODTYPE, NULL);
@@ -3121,12 +3124,10 @@
{
if (m_pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))
{
- LONG d = pSmp->nC5Speed;
+ UINT d = pSmp->nC5Speed;
if (d < 1) d = 8363;
- d += (pos * 25);
- if (d > 96000) d = 96000;
- if (d < 2000) d = 2000;
- pSmp->nC5Speed = d;
+ d += (pos * m_nFinetuneStep);
+ pSmp->nC5Speed = CLAMP(d, 579, 139921); // B-8, C-1
int transp = CSoundFile::FrequencyToTranspose(pSmp->nC5Speed) >> 7;
int basenote = 60 - transp;
if (basenote < BASENOTE_MIN) basenote = BASENOTE_MIN;
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.h 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.h 2009-09-13 20:41:27 UTC (rev 363)
@@ -23,6 +23,7 @@
uint32 m_nSequenceMs;
uint32 m_nSeekWindowMs;
uint32 m_nOverlapMs;
+ uint16 m_nFinetuneStep; // Increment finetune by x when using spin control. Default = 25
enum {nDefaultStretchChunkSize = 8192};
CComboBox m_ComboPitch, m_ComboQuality, m_ComboFFT;
Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mod2wave.cpp 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2009-09-13 20:41:27 UTC (rev 363)
@@ -57,14 +57,24 @@
END_MESSAGE_MAP()
-CWaveConvert::CWaveConvert(CWnd *parent):CDialog(IDD_WAVECONVERT, parent)
-//-----------------------------------------------------------------------
+CWaveConvert::CWaveConvert(CWnd *parent, ORDERINDEX nMinOrder, ORDERINDEX nMaxOrder):
+ CDialog(IDD_WAVECONVERT, parent)
+//-----------------------------------------------------------------------------------
{
m_bGivePlugsIdleTime = false;
m_bNormalize = FALSE;
m_bHighQuality = FALSE;
m_bSelectPlay = FALSE;
- m_nMinOrder = m_nMaxOrder = 0;
+ if(nMinOrder != ORDERINDEX_INVALID && nMaxOrder != ORDERINDEX_INVALID)
+ {
+ // render selection
+ m_nMinOrder = nMinOrder;
+ m_nMaxOrder = nMaxOrder;
+ m_bSelectPlay = true;
+ } else
+ {
+ m_nMinOrder = m_nMaxOrder = 0;
+ }
m_dwFileLimit = 0;
m_dwSongLimit = 0;
memset(&WaveFormat, 0, sizeof(WaveFormat));
@@ -110,6 +120,8 @@
SetDlgItemInt(IDC_EDIT3, m_nMinOrder);
SetDlgItemInt(IDC_EDIT4, m_nMaxOrder);
+
+
for (UINT i=0; i<NUMMIXRATE; i++)
{
UINT n = nMixingRates[i];
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-13 20:41:27 UTC (rev 363)
@@ -1388,6 +1388,12 @@
void CModDoc::OnFileWaveConvert()
//-------------------------------
{
+ OnFileWaveConvert(0, 0);
+}
+
+void CModDoc::OnFileWaveConvert(ORDERINDEX nMinOrder, ORDERINDEX nMaxOrder)
+//-------------------------------------------------------------------------
+{
TCHAR fname[_MAX_FNAME]="";
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
@@ -1398,7 +1404,7 @@
"Wave Files (*.wav)|*.wav||", pMainFrm);
dlg.m_ofn.lpstrInitialDir = CMainFrame::GetWorkingDirectory(DIR_EXPORT);
- CWaveConvert wsdlg(pMainFrm);
+ CWaveConvert wsdlg(pMainFrm, nMinOrder, nMaxOrder);
if (wsdlg.DoModal() != IDOK) return;
if (dlg.DoModal() != IDOK) return; //rewbs: made filename dialog appear after wav settings dialog
@@ -1409,9 +1415,7 @@
strcpy(s, dlg.GetPathName());
// Saving as wave file
-// -> CODE#0024
-// -> DESC="wav export update"
- UINT p = 0,n = 1;
+ UINT p = 0, n = 1;
DWORD flags[MAX_BASECHANNELS];
CHAR channel[MAX_CHANNELNAME+10];
@@ -1434,38 +1438,12 @@
dwcdlg.m_dwSongLimit = wsdlg.m_dwSongLimit;
dwcdlg.m_nMaxPatterns = (wsdlg.m_bSelectPlay) ? wsdlg.m_nMaxOrder - wsdlg.m_nMinOrder + 1 : 0;
//if(wsdlg.m_bHighQuality) CSoundFile::SetResamplingMode(SRCMODE_POLYPHASE);
-// -! NEW_FEATURE#0024
BOOL bplaying = FALSE;
UINT pos = m_SndFile.GetCurrentPos();
bplaying = TRUE;
pMainFrm->PauseMod();
-// rewbs.fix3239: moved position definition into loop below
-/* m_SndFile.SetCurrentPos(0);
- if (wsdlg.m_bSelectPlay)
- {
- m_SndFile.SetCurrentOrder(wsdlg.m_nMinOrder);
- m_SndFile.m_nCurrentPattern = wsdlg.m_nMinOrder;
- m_SndFile.GetLength(TRUE, FALSE);
- m_SndFile.m_nMaxOrderPosition = wsdlg.m_nMaxOrder + 1;
- }
-*/
-//end rewbs.fix3239: moved position definition into loop below
- // Saving file
-
-// -> CODE#0024
-// -> DESC="wav export update"
-// CDoWaveConvert dwcdlg(&m_SndFile, s, &wsdlg.WaveFormat.Format, wsdlg.m_bNormalize, pMainFrm);
-// dwcdlg.m_dwFileLimit = wsdlg.m_dwFileLimit;
-// dwcdlg.m_dwSongLimit = wsdlg.m_dwSongLimit;
-// dwcdlg.m_nMaxPatterns = (wsdlg.m_bSelectPlay) ? wsdlg.m_nMaxOrder - wsdlg.m_nMinOrder + 1 : 0;
-// if (wsdlg.m_bHighQuality)
-// {
-// CSoundFile::SetResamplingMode(SRCMODE_POLYPHASE);
-// }
-// dwcdlg.DoModal();
-
for(UINT i = 0 ; i < n ; i++){
// Channel mode
@@ -1504,7 +1482,6 @@
if(wsdlg.m_bChannelMode){
for(UINT i = 0 ; i < n ; i++) m_SndFile.ChnSettings[i].dwFlags = flags[i];
}
-// -! NEW_FEATURE#0024
m_SndFile.SetCurrentPos(pos);
m_SndFile.GetLength(TRUE);
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-09-13 20:41:27 UTC (rev 363)
@@ -268,6 +268,8 @@
CSize GetOldPatternScrollbarsPos() const { return m_szOldPatternScrollbarsPos; };
void SetOldPatternScrollbarsPos( CSize s ){ m_szOldPatternScrollbarsPos = s; };
+ void OnFileWaveConvert(ORDERINDEX nMinOrder, ORDERINDEX nMaxOrder);
+
// protected members
protected:
CSize m_szOldPatternScrollbarsPos;
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-13 20:41:27 UTC (rev 363)
@@ -1946,7 +1946,7 @@
m_bContinueSearch = TRUE;
EndWaitCursor();
// Display search results
- m_dwReplaceFlags &= ~PATSEARCH_REPLACEALL;
+ //m_dwReplaceFlags &= ~PATSEARCH_REPLACEALL;
if (!nFound)
{
if (m_dwFindFlags & PATSEARCH_NOTE)
Modified: trunk/OpenMPT/mptrack/mod2wave.h
===================================================================
--- trunk/OpenMPT/mptrack/mod2wave.h 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/mod2wave.h 2009-09-13 20:41:27 UTC (rev 363)
@@ -14,7 +14,7 @@
ULONGLONG m_dwFileLimit;
DWORD m_dwSongLimit;
BOOL m_bSelectPlay, m_bNormalize, m_bHighQuality, m_bGivePlugsIdleTime;
- UINT m_nMinOrder, m_nMaxOrder;
+ ORDERINDEX m_nMinOrder, m_nMaxOrder;
CComboBox m_CbnSampleRate, m_CbnSampleFormat;
CEdit m_EditMinOrder, m_EditMaxOrder;
@@ -24,7 +24,7 @@
// -! NEW_FEATURE#0024
public:
- CWaveConvert(CWnd *parent);
+ CWaveConvert(CWnd *parent, ORDERINDEX nMinOrder = ORDERINDEX_INVALID, ORDERINDEX nMaxOrder = ORDERINDEX_INVALID);
public:
void UpdateDialog();
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-09-13 13:44:24 UTC (rev 362)
+++ trunk/OpenMPT/mptrack/resource.h 2009-09-13 20:41:27 UTC (rev 363)
@@ -1116,6 +1116,7 @@
#define ID_OVERFLOWPASTE 59226
#define ID_NOTEMAP_COPY_NOTE 59227
#define ID_CLEANUP_REARRANGESAMPLES 59228
+#define ID_ORDERLIST_RENDER 59229
// Next default values for new objects
//
@@ -1123,7 +1124,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 521
-#define _APS_NEXT_COMMAND_VALUE 59229
+#define _APS_NEXT_COMMAND_VALUE 59230
#define _APS_NEXT_CONTROL_VALUE 2387
#define _APS_NEXT_SYMED_VALUE 901
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-13 13:44:34
|
Revision: 362
http://modplug.svn.sourceforge.net/modplug/?rev=362&view=rev
Author: saga-games
Date: 2009-09-13 13:44:24 +0000 (Sun, 13 Sep 2009)
Log Message:
-----------
[Fix] XM Compatibility: Portamento + New Note with no previous note (tentative fix), Offset beyond sample range
[Fix] IT Compatibility: Offset beyond sample range
[Ref] Replaced some NULLs and BOOL variables by nullptrs and bools
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/soundlib/Sampleio.cpp
trunk/OpenMPT/soundlib/Snd_flt.cpp
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/Sndmix.cpp
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -849,7 +849,7 @@
else if ((nsmp) && (nsmp < MAX_SAMPLES)) { //Or set sample
MODSAMPLE *pSmp = &m_SndFile.Samples[nsmp];
pChn->pCurrentSample = pSmp->pSample;
- pChn->pModInstrument = NULL;
+ pChn->pModInstrument = nullptr;
pChn->pModSample = pSmp;
pChn->pSample = pSmp->pSample;
pChn->nFineTune = pSmp->nFineTune;
@@ -864,13 +864,13 @@
pChn->nFadeOutVol = 0x10000;
}
- m_SndFile.NoteChange(nChn, note, FALSE, TRUE, TRUE);
+ m_SndFile.NoteChange(nChn, note, false, true, true);
if (nVol >= 0) pChn->nVolume = nVol;
// handle sample looping.
// Fix: Bug report 1700.
//if ((loopstart + 16 < loopend) && (loopstart >= 0) && (loopend <= (LONG)pChn->nLength)) {
- if ((loopstart + 16 < loopend) && (loopstart >= 0) && (pChn->pModSample != 0))
+ if ((loopstart + 16 < loopend) && (loopstart >= 0) && (pChn->pModSample != nullptr))
{
pChn->nPos = loopstart;
pChn->nPosLo = 0;
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -142,7 +142,7 @@
// Removing all instrument headers
for (UINT i1=0; i1<MAX_CHANNELS; i1++)
{
- m_SndFile.Chn[i1].pModInstrument = NULL;
+ m_SndFile.Chn[i1].pModInstrument = nullptr;
}
for (UINT i2=0; i2<m_SndFile.m_nInstruments; i2++) if (m_SndFile.Instruments[i2])
{
Modified: trunk/OpenMPT/soundlib/Sampleio.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -126,7 +126,7 @@
{
if (Chn[i].pModInstrument == pIns)
{
- Chn[i].pModInstrument = NULL;
+ Chn[i].pModInstrument = nullptr;
}
}
delete pIns;
@@ -450,7 +450,7 @@
if (pSmp->pSample)
{
FreeSample(pSmp->pSample);
- pSmp->pSample = NULL;
+ pSmp->pSample = nullptr;
pSmp->nLength = 0;
}
pSmp->nLength = pdata->length / samplesize;
@@ -1620,7 +1620,7 @@
if (pSmp->pSample)
{
FreeSample(pSmp->pSample);
- pSmp->pSample = NULL;
+ pSmp->pSample = nullptr;
pSmp->nLength = 0;
}
pSmp->nLength = dwSSNDLen / samplesize;
Modified: trunk/OpenMPT/soundlib/Snd_flt.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_flt.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/soundlib/Snd_flt.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -70,7 +70,7 @@
// Simple 2-poles resonant filter
-void CSoundFile::SetupChannelFilter(MODCHANNEL *pChn, BOOL bReset, int flt_modifier) const
+void CSoundFile::SetupChannelFilter(MODCHANNEL *pChn, bool bReset, int flt_modifier) const
//----------------------------------------------------------------------------------------
{
float fs = (float)gdwMixingFreq;
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -538,7 +538,7 @@
// Invalid sample ?
if (!pSmp)
{
- pChn->pModSample = NULL;
+ pChn->pModSample = nullptr;
pChn->nInsVol = 0;
return;
}
@@ -612,7 +612,7 @@
}
-void CSoundFile::NoteChange(UINT nChn, int note, BOOL bPorta, BOOL bResetEnv, BOOL bManual)
+void CSoundFile::NoteChange(UINT nChn, int note, bool bPorta, bool bResetEnv, bool bManual)
//-----------------------------------------------------------------------------------------
{
if (note < 1) return;
@@ -677,6 +677,10 @@
// IT Compatibility: Update multisample instruments frequency even if instrument is not specified
if(!bPorta && pSmp && IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nC5Speed = pSmp->nC5Speed;
+ // XM Compatibility: Ignore notes with portamento if there was no note
+ if(bPorta && (pChn->nPeriod == 0) && IsCompatibleMode(TRK_FASTTRACKER2))
+ return;
+
if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2|MOD_TYPE_MED)) note += pChn->nTranspose;
note = CLAMP(note, 1, 132);
pChn->nNote = note;
@@ -723,7 +727,7 @@
if (pChn->nPos >= pChn->nLength) pChn->nPos = pChn->nLoopStart;
}
else
- bPorta = FALSE;
+ bPorta = false;
if ((!bPorta) || (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)))
|| ((pChn->dwFlags & CHN_NOTEFADE) && (!pChn->nFadeOutVol))
@@ -804,12 +808,12 @@
pChn->nAutoVibPos = 0;
}
pChn->nLeftVol = pChn->nRightVol = 0;
- BOOL bFlt = (m_dwSongFlags & SONG_MPTFILTERMODE) ? FALSE : TRUE;
+ bool bFlt = (m_dwSongFlags & SONG_MPTFILTERMODE) ? false : true;
// Setup Initial Filter for this note
if (pIns)
{
- if (pIns->nIFR & 0x80) { pChn->nResonance = pIns->nIFR & 0x7F; bFlt = TRUE; }
- if (pIns->nIFC & 0x80) { pChn->nCutOff = pIns->nIFC & 0x7F; bFlt = TRUE; }
+ if (pIns->nIFR & 0x80) { pChn->nResonance = pIns->nIFR & 0x7F; bFlt = true; }
+ if (pIns->nIFC & 0x80) { pChn->nCutOff = pIns->nIFC & 0x7F; bFlt = true; }
if (bFlt && (pIns->nFilterMode != FLTMODE_UNCHANGED)) {
pChn->nFilterMode = pIns->nFilterMode;
}
@@ -819,7 +823,7 @@
pChn->nCutSwing = pChn->nResSwing = 0;
}
#ifndef NO_FILTER
- if ((pChn->nCutOff < 0x7F) && (bFlt)) SetupChannelFilter(pChn, TRUE);
+ if ((pChn->nCutOff < 0x7F) && (bFlt)) SetupChannelFilter(pChn, true);
#endif // NO_FILTER
}
// Special case for MPT
@@ -913,7 +917,7 @@
note = pHeader->NoteMap[note-1];
if ((n) && (n < MAX_SAMPLES)) pSample = Samples[n].pSample;
}
- } else pSample = NULL;
+ } else pSample = nullptr;
}
MODCHANNEL *p = pChn;
//if (!pIns) return;
@@ -1337,7 +1341,7 @@
InstrumentChange(pChn, pChn->nNewIns, bPorta, FALSE, (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) ? FALSE : TRUE);
pChn->nNewIns = 0;
}
- NoteChange(nChn, note, bPorta, (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) ? FALSE : TRUE);
+ NoteChange(nChn, note, bPorta, (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) ? false : true);
if ((bPorta) && (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)) && (instr))
{
pChn->dwFlags |= CHN_FASTVOLRAMP;
@@ -2780,7 +2784,7 @@
if (oldcutoff < 0) oldcutoff = -oldcutoff;
if ((pChn->nVolume > 0) || (oldcutoff < 0x10)
|| (!(pChn->dwFlags & CHN_FILTER)) || (!(pChn->nLeftVol|pChn->nRightVol)))
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true);
#endif // NO_FILTER
}
break;
@@ -2794,7 +2798,7 @@
}
#ifndef NO_FILTER
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true);
#endif // NO_FILTER
break;
@@ -2804,7 +2808,7 @@
{
pChn->nFilterMode = (dwParam>>4);
#ifndef NO_FILTER
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true);
#endif // NO_FILTER
}
break;
@@ -2916,7 +2920,7 @@
if (oldcutoff < 0) oldcutoff = -oldcutoff;
if ((pChn->nVolume > 0) || (oldcutoff < 0x10)
|| (!(pChn->dwFlags & CHN_FILTER)) || (!(pChn->nLeftVol|pChn->nRightVol)))
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true);
#endif // NO_FILTER
} break;
@@ -2935,7 +2939,7 @@
pChn->nResonance = (BYTE) (pChn->m_nPlugInitialParamValue + (m_nTickCount+1)*pChn->m_nPlugParamValueStep + 0.5);
pChn->nRestoreResonanceOnNewNote = 0;
#ifndef NO_FILTER
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true);
#endif // NO_FILTER
}
@@ -2947,7 +2951,7 @@
{
pChn->nFilterMode = (dwParam>>4);
#ifndef NO_FILTER
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true);
#endif // NO_FILTER
}
break;
@@ -3044,13 +3048,22 @@
pChn->nPos += param;
if (pChn->nPos >= pChn->nLength)
{
+ // Offset beyond sample size
if (!(m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2)))
{
- pChn->nPos = pChn->nLoopStart;
+ if(IsCompatibleMode(TRK_IMPULSETRACKER))
+ pChn->nPos = 0; // IT Compatibility: Reset to beginning of sample
+ else
+ pChn->nPos = pChn->nLoopStart;
if ((m_dwSongFlags & SONG_ITOLDEFFECTS) && (pChn->nLength > 4))
{
pChn->nPos = pChn->nLength - 2;
}
+ } else if(IsCompatibleMode(TRK_FASTTRACKER2))
+ {
+ // XM Compatibility: Don't play note
+ pChn->dwFlags |= CHN_FASTVOLRAMP;
+ pChn->nVolume = pChn->nPeriod = 0;
}
}
} else
@@ -3139,7 +3152,7 @@
if ((pChn->nRowInstr) && (param < 0x100)) { InstrumentChange(pChn, pChn->nRowInstr, FALSE, FALSE); bResetEnv = TRUE; }
if (param < 0x100) bResetEnv = TRUE;
}
- NoteChange(nChn, nNote, FALSE, bResetEnv);
+ NoteChange(nChn, nNote, false, bResetEnv);
if (m_nInstruments) {
ProcessMidiOut(nChn, pChn); //Send retrig to Midi
}
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -806,7 +806,7 @@
if (pSmp->pSample)
{
FreeSample(pSmp->pSample);
- pSmp->pSample = NULL;
+ pSmp->pSample = nullptr;
}
}
for (i=0; i<MAX_INSTRUMENTS; i++)
@@ -1449,8 +1449,8 @@
if(resetMask & 2)
{
Chn[i].nNote = Chn[i].nNewNote = Chn[i].nNewIns = 0;
- Chn[i].pModSample = NULL;
- Chn[i].pModInstrument = NULL;
+ Chn[i].pModSample = nullptr;
+ Chn[i].pModInstrument = nullptr;
Chn[i].nPortamentoDest = 0;
Chn[i].nCommand = 0;
Chn[i].nPatternLoopCount = 0;
@@ -1473,9 +1473,9 @@
Chn[i].nLoopStart = 0;
Chn[i].nLoopEnd = 0;
Chn[i].nROfs = Chn[i].nLOfs = 0;
- Chn[i].pSample = NULL;
- Chn[i].pModSample = NULL;
- Chn[i].pModInstrument = NULL;
+ Chn[i].pSample = nullptr;
+ Chn[i].pModSample = nullptr;
+ Chn[i].pModInstrument = nullptr;
Chn[i].nCutOff = 0x7F;
Chn[i].nResonance = 0;
Chn[i].nFilterMode = 0;
@@ -2001,7 +2001,7 @@
{
pSmp->nLength = 0;
FreeSample(pSmp->pSample);
- pSmp->pSample = NULL;
+ pSmp->pSample = nullptr;
MessageBox(0, str_SampleAllocationError, str_Error, MB_ICONERROR);
return 0;
}
@@ -2438,7 +2438,7 @@
{
pSmp->nLength = 0;
FreeSample(pSmp->pSample);
- pSmp->pSample = NULL;
+ pSmp->pSample = nullptr;
}
return 0;
}
@@ -2766,7 +2766,7 @@
if (!Samples[nSample].pSample) return TRUE;
MODSAMPLE *pSmp = &Samples[nSample];
LPSTR pSample = pSmp->pSample;
- pSmp->pSample = NULL;
+ pSmp->pSample = nullptr;
pSmp->nLength = 0;
pSmp->uFlags &= ~(CHN_16BIT);
for (UINT i=0; i<MAX_CHANNELS; i++)
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2009-09-13 13:44:24 UTC (rev 362)
@@ -796,7 +796,7 @@
BOOL ProcessEffects();
UINT GetNNAChannel(UINT nChn) const;
void CheckNNA(UINT nChn, UINT instr, int note, BOOL bForceCut);
- void NoteChange(UINT nChn, int note, BOOL bPorta=FALSE, BOOL bResetEnv=TRUE, BOOL bManual=FALSE);
+ void NoteChange(UINT nChn, int note, bool bPorta = false, bool bResetEnv = true, bool bManual = false);
void InstrumentChange(MODCHANNEL *pChn, UINT instr, BOOL bPorta=FALSE,BOOL bUpdVol=TRUE,BOOL bResetEnv=TRUE);
// Channel Effects
@@ -834,7 +834,7 @@
void ExtendedChannelEffect(MODCHANNEL *, UINT param);
void ProcessMidiMacro(UINT nChn, LPCSTR pszMidiMacro, UINT param=0);
void ProcessSmoothMidiMacro(UINT nChn, LPCSTR pszMidiMacro, UINT param=0); //rewbs.smoothVST
- void SetupChannelFilter(MODCHANNEL *pChn, BOOL bReset, int flt_modifier=256) const;
+ void SetupChannelFilter(MODCHANNEL *pChn, bool bReset, int flt_modifier = 256) const;
// Low-Level effect processing
void DoFreqSlide(MODCHANNEL *pChn, LONG nFreqSlide);
void GlobalVolSlide(UINT param, UINT * nOldGlobalVolSlide);
Modified: trunk/OpenMPT/soundlib/Sndmix.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-09-11 19:32:52 UTC (rev 361)
+++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-09-13 13:44:24 UTC (rev 362)
@@ -698,9 +698,9 @@
Chn[i].dwFlags = ChnSettings[i].dwFlags;
Chn[i].nLoopStart = 0;
Chn[i].nLoopEnd = 0;
- Chn[i].pModInstrument = NULL;
- Chn[i].pSample = NULL;
- Chn[i].pModSample = NULL;
+ Chn[i].pModInstrument = nullptr;
+ Chn[i].pSample = nullptr;
+ Chn[i].pModSample = nullptr;
}
}
}
@@ -1302,7 +1302,7 @@
if (pIns->dwFlags & ENV_FILTER)
{
#ifndef NO_FILTER
- SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? FALSE : TRUE, envpitch);
+ SetupChannelFilter(pChn, (pChn->dwFlags & CHN_FILTER) ? false : true, envpitch);
#endif // NO_FILTER
} else
// Pitch Envelope
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-11 19:33:12
|
Revision: 361
http://modplug.svn.sourceforge.net/modplug/?rev=361&view=rev
Author: saga-games
Date: 2009-09-11 19:32:52 +0000 (Fri, 11 Sep 2009)
Log Message:
-----------
[Fix] MPTM Saving: Save Note Fade (~~) properly
[Fix] Mod Conversion: Unset release nodes were corrupted when converting modules
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-10 21:00:57 UTC (rev 360)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-11 19:32:52 UTC (rev 361)
@@ -778,7 +778,7 @@
TRIMENV(mptEnv->nLoopEnd);
TRIMENV(mptEnv->nSustainStart);
TRIMENV(mptEnv->nSustainEnd);
- TRIMENV(mptEnv->nReleaseNode);
+ if(mptEnv->nReleaseNode != ENV_RELEASE_NODE_UNSET) TRIMENV(mptEnv->nReleaseNode);
#undef TRIMENV
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-10 21:00:57 UTC (rev 360)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-11 19:32:52 UTC (rev 361)
@@ -2190,7 +2190,7 @@
UINT note = m->note;
if (note) b |= 1;
if ((note) && (note < NOTE_MIN_SPECIAL)) note--;
- if (note == NOTE_FADE) note = 0xF6;
+ if (note == NOTE_FADE && GetType() != MOD_TYPE_MPT) note = 0xF6;
if (m->instr) b |= 2;
if (m->volcmd)
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-10 21:01:07
|
Revision: 360
http://modplug.svn.sourceforge.net/modplug/?rev=360&view=rev
Author: saga-games
Date: 2009-09-10 21:00:57 +0000 (Thu, 10 Sep 2009)
Log Message:
-----------
[Fix] Instrument Tab: Proper limits for IT/XM fadeout values
[Fix] XM / IT Saver: Limit fadeout values properly
[Imp] IT Compatibility Export: Removed stereo sample support
[Imp] Updated DE_jojo.mkb keymap (added Save As command)
[Imp] Updated IT Mod Specifications
[Imp] Comments tab: Usage of existing sample size + bit depth functions to calculate information
[Imp] XM Loader: Advanced "made with MPT" detection
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_ins.cpp
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/view_com.cpp
trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
trunk/OpenMPT/soundlib/mod_specifications.h
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-09-10 13:31:37 UTC (rev 359)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-09-10 21:00:57 UTC (rev 360)
@@ -801,7 +801,7 @@
m_ComboDCA.AddString("Note Off");
m_ComboDCA.AddString("Note Fade");
// FadeOut Volume
- m_SpinFadeOut.SetRange(0, 32000);
+ m_SpinFadeOut.SetRange(0, 8192);
// Global Volume
m_SpinGlobalVol.SetRange(0, 64);
// Panning
@@ -1072,7 +1072,13 @@
m_SpinMidiPR.EnableWindow(bITandXM);
m_SpinMidiBK.EnableWindow(bITandXM); //rewbs.MidiBank
//end rewbs.instroVSTi
+
m_SpinFadeOut.EnableWindow(bITandXM);
+ if(m_pSndFile->m_nType & MOD_TYPE_XM)
+ m_SpinFadeOut.SetRange(0, 4095);
+ else
+ m_SpinFadeOut.SetRange(0, 8192);
+
m_NoteMap.EnableWindow(bITandXM);
m_CbnResampling.EnableWindow(bITandXM);
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-10 13:31:37 UTC (rev 359)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-10 21:00:57 UTC (rev 360)
@@ -768,7 +768,7 @@
//-------------------------------------------------------
{
// shorten instrument envelope if necessary (for mod conversion)
- const int iEnvMax = m_SndFile.GetModSpecifications().envelopePointsMax;
+ const UINT iEnvMax = m_SndFile.GetModSpecifications().envelopePointsMax;
bool bResult = false;
#define TRIMENV(i) if(i > iEnvMax) {i = iEnvMax; bResult = true;}
Modified: trunk/OpenMPT/mptrack/view_com.cpp
===================================================================
--- trunk/OpenMPT/mptrack/view_com.cpp 2009-09-10 13:31:37 UTC (rev 359)
+++ trunk/OpenMPT/mptrack/view_com.cpp 2009-09-10 21:00:57 UTC (rev 360)
@@ -252,15 +252,13 @@
case SMPLIST_SIZE:
if (pSmp->nLength)
{
- UINT nShift = (pSmp->uFlags & CHN_16BIT) ? 9 : 10;
- if (pSmp->uFlags & CHN_STEREO) nShift--;
- wsprintf(s, "%d KB", pSmp->nLength >> nShift);
+ wsprintf(s, "%d KB", pSmp->GetSampleSizeInBytes() >> 10);
}
break;
case SMPLIST_TYPE:
if (pSmp->nLength)
{
- strcpy(s, (pSmp->uFlags & CHN_16BIT) ? "16 Bit" : "8 Bit");
+ wsprintf(s, "%d Bit", pSmp->GetElementarySampleSize() << 3);
}
break;
case SMPLIST_INSTR:
Modified: trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb
===================================================================
--- trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb 2009-09-10 13:31:37 UTC (rev 359)
+++ trunk/OpenMPT/packageTemplate/extraKeymaps/DE_jojo.mkb 2009-09-10 21:00:57 UTC (rev 360)
@@ -8,6 +8,7 @@
0:1346:2:79:1 //File/Open: Ctrl+O (KeyDown)
0:1348:2:87:5 //File/Close: Ctrl+W (KeyDown|KeyHold)
0:1349:2:83:1 //File/Save: Ctrl+S (KeyDown)
+0:1350:3:83:1 //File/Save As: Shift+Ctrl+S (KeyDown)
0:1693:0:166:1 //Previous Document: (KeyDown)
0:1694:0:167:1 //Next Document: (KeyDown)
0:1030:0:116:1 //Play song/Pause song: F5 (KeyDown)
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-10 13:31:37 UTC (rev 359)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-10 21:00:57 UTC (rev 360)
@@ -301,7 +301,7 @@
}
if (pis->mbank<=128)
pIns->wMidiBank = pis->mbank;
- pIns->nFadeOut = pis->fadeout << 5; // should be 6?
+ pIns->nFadeOut = pis->fadeout << 5;
pIns->nGlobalVol = pis->gbv >> 1;
if (pIns->nGlobalVol > 64) pIns->nGlobalVol = 64;
for (UINT j = 0; j < 120; j++)
@@ -2003,7 +2003,7 @@
//if (pIns->nDCT<DCT_PLUGIN) iti.dct = pIns->nDCT; else iti.dct =0;
iti.dct = pIns->nDCT; //rewbs.instroVSTi: will other apps barf if they get an unknown DCT?
iti.dca = pIns->nDNA;
- iti.fadeout = pIns->nFadeOut >> 5; // should be 6?
+ iti.fadeout = min(pIns->nFadeOut >> 5 , 256);
iti.pps = pIns->nPPS;
iti.ppc = pIns->nPPC;
iti.gbv = (BYTE)(pIns->nGlobalVol << 1);
@@ -2648,7 +2648,7 @@
iti.nna = pIns->nNNA;
if (pIns->nDCT<DCT_PLUGIN) iti.dct = pIns->nDCT; else iti.dct =0;
iti.dca = pIns->nDNA;
- iti.fadeout = pIns->nFadeOut >> 5;
+ iti.fadeout = min(pIns->nFadeOut >> 5 , 256);
iti.pps = pIns->nPPS;
iti.ppc = pIns->nPPC;
iti.gbv = (BYTE)(pIns->nGlobalVol << 1);
@@ -2991,30 +2991,10 @@
if (psmp->uFlags & CHN_PANNING) itss.dfp |= 0x80;
if ((psmp->pSample) && (psmp->nLength)) itss.cvt = 0x01;
UINT flags = RS_PCM8S;
- /*
-#ifndef NO_PACKING
- if (nPacking)
+ if (psmp->uFlags & CHN_16BIT)
{
- if ((!(psmp->uFlags & (CHN_16BIT|CHN_STEREO)))
- && (CanPackSample(psmp->pSample, psmp->nLength, nPacking)))
- {
- flags = RS_ADPCM4;
- itss.cvt = 0xFF;
- }
- } else
-#endif // NO_PACKING
- */
- {
- if (psmp->uFlags & CHN_STEREO)
- {
- flags = RS_STPCM8S;
- itss.flags |= 0x04;
- }
- if (psmp->uFlags & CHN_16BIT)
- {
- itss.flags |= 0x02;
- flags = (psmp->uFlags & CHN_STEREO) ? RS_STPCM16S : RS_PCM16S;
- }
+ itss.flags |= 0x02;
+ flags = RS_PCM16S;
}
itss.samplepointer = dwPos;
fseek(f, smppos[nsmp-1], SEEK_SET);
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-10 13:31:37 UTC (rev 359)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-10 21:00:57 UTC (rev 360)
@@ -119,22 +119,6 @@
if ((!channels) || (channels > MAX_BASECHANNELS)) return false;
// -! BEHAVIOUR_CHANGE#0006
- if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v2.00 ", 20) && bProbablyMadeWithModPlug) bMadeWithModPlug = true;
- if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v 2.00 ", 20))
- {
- bMadeWithModPlug = true;
- m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 00, 00, 00);
- }
-
- if (!memcmp((LPCSTR)lpStream + 0x26, "OpenMPT ", 8))
- {
- //bMadeWithModPlug = true; // Don't set it - it's also used by compatibility export
- CHAR sVersion[13];
- memcpy(sVersion, lpStream + 0x26 + 8, 12);
- sVersion[12] = 0;
- m_dwLastSavedWithVersion = MptVersion::ToNum(sVersion);
- }
-
m_nType = MOD_TYPE_XM;
m_nMinPeriod = 27;
m_nMaxPeriod = 54784;
@@ -334,7 +318,10 @@
Instruments[iIns]->nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE;
memcpy(Instruments[iIns]->name, pih->name, 22);
-
+ // look for null-terminated instr name - that's most likely a tune made with modplug
+ for(int i = 0; i < 22; i++)
+ if(pih->name[i] == 0) bProbablyMadeWithModPlug = true;
+
if ((nsamples = pih->samples) > 0)
{
/* we have samples, so let's read the rest of this instrument
@@ -560,6 +547,9 @@
pSmp->nVibRate = xmsh.vibrate;
memcpy(pSmp->filename, xmss.name, 22);
pSmp->filename[21] = 0;
+ // look for null-terminated sample name - that's most likely a tune made with modplug
+ for(int i = 0; i < 22; i++)
+ if(xmss.name[i] == 0) bProbablyMadeWithModPlug = true;
}
#if 0
if ((xmsh.reserved2 > nsamples) && (xmsh.reserved2 <= 16))
@@ -648,6 +638,25 @@
bMadeWithModPlug = true;
}
+ // Check various things to find out whether this has been made with MPT.
+ // Null chars in names -> most likely made with MPT, which disguises as FT2
+ if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v2.00 ", 20) && bProbablyMadeWithModPlug) bMadeWithModPlug = true;
+ if (!memcmp((LPCSTR)lpStream + 0x26, "FastTracker v 2.00 ", 20))
+ {
+ // Early MPT 1.0 alpha/beta versions
+ bMadeWithModPlug = true;
+ m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 00, 00, 00);
+ }
+
+ if (!memcmp((LPCSTR)lpStream + 0x26, "OpenMPT ", 8))
+ {
+ //bMadeWithModPlug = true; // Don't set it - it's also used by compatibility export
+ CHAR sVersion[13];
+ memcpy(sVersion, lpStream + 0x26 + 8, 12);
+ sVersion[12] = 0;
+ m_dwLastSavedWithVersion = MptVersion::ToNum(sVersion);
+ }
+
if(bMadeWithModPlug)
{
SetModFlag(MSF_COMPATIBLE_PLAY, false);
@@ -862,7 +871,7 @@
{
memcpy(xmih.name, pIns->name, 22);
xmih.type = pIns->nMidiProgram;
- xmsh.volfade = pIns->nFadeOut;
+ xmsh.volfade = min(pIns->nFadeOut, 0xFFF); // FFF is maximum in FT2
xmsh.vnum = (BYTE)pIns->VolEnv.nNodes;
xmsh.pnum = (BYTE)pIns->PanEnv.nNodes;
if (xmsh.vnum > 12) xmsh.vnum = 12;
Modified: trunk/OpenMPT/soundlib/mod_specifications.h
===================================================================
--- trunk/OpenMPT/soundlib/mod_specifications.h 2009-09-10 13:31:37 UTC (rev 359)
+++ trunk/OpenMPT/soundlib/mod_specifications.h 2009-09-10 21:00:57 UTC (rev 360)
@@ -33,10 +33,10 @@
INSTRUMENTINDEX instrumentsMax;
BYTE defaultMixLevels;
BYTE MIDIMappingDirectivesMax;
- UINT speedMin;
- UINT speedMax;
- bool hasComments;
- int envelopePointsMax;
+ UINT speedMin; // Minimum ticks per frame
+ UINT speedMax; // Maximum ticks per frame
+ bool hasComments; // True if format has a comments field
+ UINT envelopePointsMax; // Maximum number of points of each envelope
};
@@ -103,7 +103,7 @@
1, //Min Speed
31, //Max Speed
false, //No song comments
- 0, //Envelope point count
+ 0, //No instrument envelopes
};
// MOD with MPT extensions.
@@ -132,7 +132,7 @@
1, //Min Speed
31, //Max Speed
false, //No song comments
- 0, //Envelope point count
+ 0, //No instrument envelopes
};
const CModSpecifications xm =
@@ -216,7 +216,7 @@
1, //Min Speed
255, //Max Speed
false, //No song comments
- 0, //Envelope point count
+ 0, //No instrument envelopes
};
// S3M with MPT extensions
@@ -245,7 +245,7 @@
1, //Min Speed
255, //Max Speed
false, //No song comments
- 0, //Envelope point count
+ 0, //No instrument envelopes
};
const CModSpecifications it =
@@ -266,8 +266,8 @@
1, //Min pattern rows
256, //Max pattern rows
25, //Max mod name length
- 256, //SamplesMax
- 200, //instrumentMax
+ 99, //SamplesMax
+ 99, //instrumentMax
mixLevels_original, //defaultMixLevels
0, //Max MIDI mapping directives
1, //Min Speed
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-10 13:31:46
|
Revision: 359
http://modplug.svn.sourceforge.net/modplug/?rev=359&view=rev
Author: saga-games
Date: 2009-09-10 13:31:37 +0000 (Thu, 10 Sep 2009)
Log Message:
-----------
[Fix] Instrument editor: Can now also copy long MPTM envelopes
[Ref] Make use of the new envelope struct in envelope c&p and scale env points code
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-09 23:14:18 UTC (rev 358)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-10 13:31:37 UTC (rev 359)
@@ -2388,71 +2388,51 @@
{
CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
HANDLE hCpy;
- CHAR s[1024];
+ CHAR s[4096];
MODINSTRUMENT *pIns;
DWORD dwMemSize;
- UINT susBegin, susEnd, loopBegin, loopEnd, bSus, bLoop, bCarry, nPoints, releaseNode;
- WORD *pPoints;
- BYTE *pValues;
+ UINT bSus, bLoop, bCarry;
if ((nIns < 1) || (nIns > m_SndFile.m_nInstruments) || (!m_SndFile.Instruments[nIns]) || (!pMainFrm)) return FALSE;
BeginWaitCursor();
pIns = m_SndFile.Instruments[nIns];
+
+ INSTRUMENTENVELOPE *pEnv = nullptr;
+
switch(nEnv)
{
case ENV_PANNING:
- pPoints = pIns->PanEnv.Ticks;
- pValues = pIns->PanEnv.Values;
- nPoints = pIns->PanEnv.nNodes;
- bLoop = (pIns->dwFlags & ENV_PANLOOP) ? TRUE : FALSE;
- bSus = (pIns->dwFlags & ENV_PANSUSTAIN) ? TRUE : FALSE;
- bCarry = (pIns->dwFlags & ENV_PANCARRY) ? TRUE : FALSE;
- susBegin = pIns->PanEnv.nSustainStart;
- susEnd = pIns->PanEnv.nSustainEnd;
- loopBegin = pIns->PanEnv.nLoopStart;
- loopEnd = pIns->PanEnv.nLoopEnd;
- releaseNode = pIns->PanEnv.nReleaseNode;
+ pEnv = &pIns->PanEnv;
+ bLoop = (pIns->dwFlags & ENV_PANLOOP) ? 1 : 0;
+ bSus = (pIns->dwFlags & ENV_PANSUSTAIN) ? 1 : 0;
+ bCarry = (pIns->dwFlags & ENV_PANCARRY) ? 1 : 0;
break;
case ENV_PITCH:
- pPoints = pIns->PitchEnv.Ticks;
- pValues = pIns->PitchEnv.Values;
- nPoints = pIns->PitchEnv.nNodes;
- bLoop = (pIns->dwFlags & ENV_PITCHLOOP) ? TRUE : FALSE;
- bSus = (pIns->dwFlags & ENV_PITCHSUSTAIN) ? TRUE : FALSE;
- bCarry = (pIns->dwFlags & ENV_PITCHCARRY) ? TRUE : FALSE;
- susBegin = pIns->PitchEnv.nSustainStart;
- susEnd = pIns->PitchEnv.nSustainEnd;
- loopBegin = pIns->PitchEnv.nLoopStart;
- loopEnd = pIns->PitchEnv.nLoopEnd;
- releaseNode = pIns->PitchEnv.nReleaseNode;
+ pEnv = &pIns->PitchEnv;
+ bLoop = (pIns->dwFlags & ENV_PITCHLOOP) ? 1 : 0;
+ bSus = (pIns->dwFlags & ENV_PITCHSUSTAIN) ? 1 : 0;
+ bCarry = (pIns->dwFlags & ENV_PITCHCARRY) ? 1 : 0;
break;
default:
- pPoints = pIns->VolEnv.Ticks;
- pValues = pIns->VolEnv.Values;
- nPoints = pIns->VolEnv.nNodes;
- bLoop = (pIns->dwFlags & ENV_VOLLOOP) ? TRUE : FALSE;
- bSus = (pIns->dwFlags & ENV_VOLSUSTAIN) ? TRUE : FALSE;
- bCarry = (pIns->dwFlags & ENV_VOLCARRY) ? TRUE : FALSE;
- susBegin = pIns->VolEnv.nSustainStart;
- susEnd = pIns->VolEnv.nSustainEnd;
- loopBegin = pIns->VolEnv.nLoopStart;
- loopEnd = pIns->VolEnv.nLoopEnd;
- releaseNode = pIns->VolEnv.nReleaseNode;
+ pEnv = &pIns->VolEnv;
+ bLoop = (pIns->dwFlags & ENV_VOLLOOP) ? 1 : 0;
+ bSus = (pIns->dwFlags & ENV_VOLSUSTAIN) ? 1 : 0;
+ bCarry = (pIns->dwFlags & ENV_VOLCARRY) ? 1 : 0;
break;
}
strcpy(s, pszEnvHdr);
- wsprintf(s+strlen(s), pszEnvFmt, nPoints, susBegin, susEnd, loopBegin, loopEnd, bSus, bLoop, bCarry);
- for (UINT i=0; i<nPoints; i++)
+ wsprintf(s + strlen(s), pszEnvFmt, pEnv->nNodes, pEnv->nSustainStart, pEnv->nSustainEnd, pEnv->nLoopStart, pEnv->nLoopEnd, bSus, bLoop, bCarry);
+ for (UINT i = 0; i < pEnv->nNodes; i++)
{
if (strlen(s) >= sizeof(s)-32) break;
- wsprintf(s+strlen(s), "%d,%d\x0D\x0A", pPoints[i], pValues[i]);
+ wsprintf(s+strlen(s), "%d,%d\x0D\x0A", pEnv->Ticks[i], pEnv->Values[i]);
}
//Writing release node
if(strlen(s) < sizeof(s) - 32)
- wsprintf(s+strlen(s), "%u\x0D\x0A", releaseNode);
+ wsprintf(s+strlen(s), "%u\x0D\x0A", pEnv->nReleaseNode);
dwMemSize = strlen(s)+1;
if ((pMainFrm->OpenClipboard()) && ((hCpy = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, dwMemSize))!=NULL))
@@ -2486,6 +2466,8 @@
if ((hCpy) && ((p = (LPSTR)GlobalLock(hCpy)) != NULL))
{
MODINSTRUMENT *pIns = m_SndFile.Instruments[nIns];
+ INSTRUMENTENVELOPE *pEnv = nullptr;
+
UINT susBegin=0, susEnd=0, loopBegin=0, loopEnd=0, bSus=0, bLoop=0, bCarry=0, nPoints=0, releaseNode = ENV_RELEASE_NODE_UNSET;
DWORD dwMemSize = GlobalSize(hCpy), dwPos = strlen(pszEnvHdr);
if ((dwMemSize > dwPos) && (!_strnicmp(p, pszEnvHdr, dwPos-2)))
@@ -2508,60 +2490,45 @@
}
while ((dwPos < dwMemSize) && ((p[dwPos] >= '0') && (p[dwPos] <= '9'))) dwPos++;
}
- if (nPoints > 31) nPoints = 31;
+ nPoints = min(nPoints, m_SndFile.GetModSpecifications().envelopePointsMax);
if (susEnd >= nPoints) susEnd = 0;
if (susBegin > susEnd) susBegin = susEnd;
if (loopEnd >= nPoints) loopEnd = 0;
if (loopBegin > loopEnd) loopBegin = loopEnd;
- WORD *pPoints;
- BYTE *pValues;
+
switch(nEnv)
{
case ENV_PANNING:
- pPoints = pIns->PanEnv.Ticks;
- pValues = pIns->PanEnv.Values;
- pIns->PanEnv.nNodes = nPoints;
+ pEnv = &pIns->PanEnv;
pIns->dwFlags &= ~(ENV_PANLOOP|ENV_PANSUSTAIN|ENV_PANCARRY);
if (bLoop) pIns->dwFlags |= ENV_PANLOOP;
if (bSus) pIns->dwFlags |= ENV_PANSUSTAIN;
if (bCarry) pIns->dwFlags |= ENV_PANCARRY;
- pIns->PanEnv.nSustainStart = susBegin;
- pIns->PanEnv.nSustainEnd = susEnd;
- pIns->PanEnv.nLoopStart = loopBegin;
- pIns->PanEnv.nLoopEnd = loopEnd;
- pIns->PanEnv.nReleaseNode = releaseNode;
break;
case ENV_PITCH:
- pPoints = pIns->PitchEnv.Ticks;
- pValues = pIns->PitchEnv.Values;
- pIns->PitchEnv.nNodes = nPoints;
+ pEnv = &pIns->PitchEnv;
pIns->dwFlags &= ~(ENV_PITCHLOOP|ENV_PITCHSUSTAIN|ENV_PITCHCARRY);
if (bLoop) pIns->dwFlags |= ENV_PITCHLOOP;
if (bSus) pIns->dwFlags |= ENV_PITCHSUSTAIN;
if (bCarry) pIns->dwFlags |= ENV_PITCHCARRY;
- pIns->PitchEnv.nSustainStart = susBegin;
- pIns->PitchEnv.nSustainEnd = susEnd;
- pIns->PitchEnv.nLoopStart = loopBegin;
- pIns->PitchEnv.nLoopEnd = loopEnd;
- pIns->PitchEnv.nReleaseNode = releaseNode;
break;
default:
- pPoints = pIns->VolEnv.Ticks;
- pValues = pIns->VolEnv.Values;
- pIns->VolEnv.nNodes = nPoints;
+ pEnv = &pIns->VolEnv;
pIns->dwFlags &= ~(ENV_VOLLOOP|ENV_VOLSUSTAIN|ENV_VOLCARRY);
if (bLoop) pIns->dwFlags |= ENV_VOLLOOP;
if (bSus) pIns->dwFlags |= ENV_VOLSUSTAIN;
if (bCarry) pIns->dwFlags |= ENV_VOLCARRY;
- pIns->VolEnv.nSustainStart = susBegin;
- pIns->VolEnv.nSustainEnd = susEnd;
- pIns->VolEnv.nLoopStart = loopBegin;
- pIns->VolEnv.nLoopEnd = loopEnd;
- pIns->VolEnv.nReleaseNode = releaseNode;
break;
}
+ pEnv->nNodes = nPoints;
+ pEnv->nSustainStart = susBegin;
+ pEnv->nSustainEnd = susEnd;
+ pEnv->nLoopStart = loopBegin;
+ pEnv->nLoopEnd = loopEnd;
+ pEnv->nReleaseNode = releaseNode;
+
int oldn = 0;
for (UINT i=0; i<nPoints; i++)
{
@@ -2573,8 +2540,8 @@
if (dwPos >= dwMemSize) break;
int n2 = atoi(p+dwPos);
if ((n1 < oldn) || (n1 > 0x3FFF)) n1 = oldn+1;
- pPoints[i] = (WORD)n1;
- pValues[i] = (BYTE)n2;
+ pEnv->Ticks[i] = (WORD)n1;
+ pEnv->Values[i] = (BYTE)n2;
oldn = n1;
while ((dwPos < dwMemSize) && (p[dwPos] != 0x0D)) dwPos++;
if (dwPos >= dwMemSize) break;
@@ -2585,20 +2552,7 @@
{
BYTE r = static_cast<BYTE>(atoi(p + dwPos));
if(r == 0 || r >= nPoints) r = ENV_RELEASE_NODE_UNSET;
- switch(nEnv)
- {
- case ENV_PANNING:
- pIns->PanEnv.nReleaseNode = r;
- break;
-
- case ENV_PITCH:
- pIns->PitchEnv.nReleaseNode = r;
- break;
-
- default:
- pIns->VolEnv.nReleaseNode = r;
- break;
- }
+ pEnv->nReleaseNode = r;
}
}
GlobalUnlock(hCpy);
Modified: trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp
===================================================================
--- trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2009-09-09 23:14:18 UTC (rev 358)
+++ trunk/OpenMPT/mptrack/ScaleEnvPointsDlg.cpp 2009-09-10 13:31:37 UTC (rev 359)
@@ -45,36 +45,20 @@
float factor = ConvertStrTo<float>(buffer);
if(factor > 0)
{
- WORD (*array)[MAX_ENVPOINTS] = NULL;
- UINT* arraySize = NULL;
+ INSTRUMENTENVELOPE *pEnv = nullptr;
switch(m_Env)
{
- case ENV_VOLUME:
- array = &m_pInstrument->VolEnv.Ticks;
- arraySize = &m_pInstrument->VolEnv.nNodes;
- break;
-
- case ENV_PANNING:
- array = &m_pInstrument->PanEnv.Ticks;
- arraySize = &m_pInstrument->PanEnv.nNodes;
- break;
-
- case ENV_PITCH:
- array = &m_pInstrument->PitchEnv.Ticks;
- arraySize = &m_pInstrument->PitchEnv.nNodes;
- break;
+ case ENV_PANNING: pEnv = &m_pInstrument->PanEnv; break;
+ case ENV_PITCH: pEnv = &m_pInstrument->PitchEnv; break;
+ default: pEnv = &m_pInstrument->VolEnv; break;
}
-
- if(array && arraySize)
+ for(UINT i = 0; i< pEnv->nNodes; i++)
{
- for(UINT i = 0; i<*arraySize; i++)
- {
- (*array)[i] = static_cast<WORD>(factor * (*array)[i]);
+ pEnv->Ticks[i] = static_cast<WORD>(factor * pEnv->Ticks[i]);
- //Checking that the order of points is preserved.
- if(i > 0 && (*array)[i] <= (*array)[i-1])
- (*array)[i] = (*array)[i-1]+1;
- }
+ //Checking that the order of points is preserved.
+ if(i > 0 && pEnv->Ticks[i] <= pEnv->Ticks[i - 1])
+ pEnv->Ticks[i] = pEnv->Ticks[i - 1] + 1;
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-09 23:14:33
|
Revision: 358
http://modplug.svn.sourceforge.net/modplug/?rev=358&view=rev
Author: saga-games
Date: 2009-09-09 23:14:18 +0000 (Wed, 09 Sep 2009)
Log Message:
-----------
[Imp] Mod Conversion: Trim instrument envelopes if they're too long for the new format.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Modedit.cpp
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-09-09 22:43:27 UTC (rev 357)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-09-09 23:14:18 UTC (rev 358)
@@ -296,6 +296,10 @@
virtual void SetModifiedFlag(BOOL bModified=TRUE);
//}}AFX_VIRTUAL
+ // for mod conversion
+ bool UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv);
+
+
// Implementation
public:
virtual ~CModDoc();
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-09 22:43:27 UTC (rev 357)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-09 23:14:18 UTC (rev 358)
@@ -654,7 +654,7 @@
// Convert MOD/XM to S3M/IT/MPT
if (oldTypeIsMOD_XM && newTypeIsS3M_IT_MPT)
{
- for (UINT i=1; i<=m_SndFile.m_nSamples; i++)
+ for (SAMPLEINDEX i=1; i<=m_SndFile.m_nSamples; i++)
{
m_SndFile.Samples[i].nC5Speed = CSoundFile::TransposeToFrequency(m_SndFile.Samples[i].RelativeTone, m_SndFile.Samples[i].nFineTune);
m_SndFile.Samples[i].RelativeTone = 0;
@@ -666,13 +666,13 @@
// Convert S3M/IT/MPT to XM
if (oldTypeIsS3M_IT_MPT && newTypeIsXM)
{
- for (UINT i=1; i<=m_SndFile.m_nSamples; i++)
+ for (SAMPLEINDEX i=1; i<=m_SndFile.m_nSamples; i++)
{
CSoundFile::FrequencyToTranspose(&m_SndFile.Samples[i]);
if (!(m_SndFile.Samples[i].uFlags & CHN_PANNING)) m_SndFile.Samples[i].nPan = 128;
}
bool bBrokenNoteMap = false, bBrokenSustainLoop = false;
- for (UINT j = 1; j <= m_SndFile.m_nInstruments; j++)
+ for (INSTRUMENTINDEX j = 1; j <= m_SndFile.m_nInstruments; j++)
{
MODINSTRUMENT *pIns = m_SndFile.Instruments[j];
if (pIns)
@@ -747,6 +747,16 @@
m_SndFile.m_nDefaultTempo = CLAMP(m_SndFile.m_nDefaultTempo, specs.tempoMin, specs.tempoMax);
m_SndFile.m_nDefaultSpeed = CLAMP(m_SndFile.m_nDefaultSpeed, specs.speedMin, specs.speedMax);
+ bool bTrimmedEnvelopes = false;
+ for(INSTRUMENTINDEX i = 1; i <= m_SndFile.m_nInstruments; i++)
+ {
+ bTrimmedEnvelopes |= UpdateEnvelopes(&m_SndFile.Instruments[i]->VolEnv);
+ bTrimmedEnvelopes |= UpdateEnvelopes(&m_SndFile.Instruments[i]->PanEnv);
+ bTrimmedEnvelopes |= UpdateEnvelopes(&m_SndFile.Instruments[i]->PitchEnv);
+ }
+ if(bTrimmedEnvelopes == true)
+ AddToLog("WARNING: Instrument envelopes have been shortened.\n");
+
SetModified();
ClearUndo();
UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODGENERAL);
@@ -754,11 +764,32 @@
return TRUE;
}
+bool CModDoc::UpdateEnvelopes(INSTRUMENTENVELOPE *mptEnv)
+//-------------------------------------------------------
+{
+ // shorten instrument envelope if necessary (for mod conversion)
+ const int iEnvMax = m_SndFile.GetModSpecifications().envelopePointsMax;
+ bool bResult = false;
+ #define TRIMENV(i) if(i > iEnvMax) {i = iEnvMax; bResult = true;}
+ TRIMENV(mptEnv->nNodes);
+ TRIMENV(mptEnv->nLoopStart);
+ TRIMENV(mptEnv->nLoopEnd);
+ TRIMENV(mptEnv->nSustainStart);
+ TRIMENV(mptEnv->nSustainEnd);
+ TRIMENV(mptEnv->nReleaseNode);
+ #undef TRIMENV
+ return bResult;
+}
+
+
+
+
+
// Change the number of channels
BOOL CModDoc::ChangeNumChannels(UINT nNewChannels, const bool showCancelInRemoveDlg)
//------------------------------------------------
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-09 22:43:42
|
Revision: 357
http://modplug.svn.sourceforge.net/modplug/?rev=357&view=rev
Author: saga-games
Date: 2009-09-09 22:43:27 +0000 (Wed, 09 Sep 2009)
Log Message:
-----------
[New] MPTM: Allow up to 240 envelope points (did not set it to 255 to have a safety margin). Write additional loop points to extended instrument properties.
[Ref] Rewrote a bit of the IT loader to avoid C&P code, removed constants where they should not be used
Modified Paths:
--------------
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_xm.cpp
trunk/OpenMPT/soundlib/Snd_defs.h
trunk/OpenMPT/soundlib/mod_specifications.h
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2009-09-07 20:24:18 UTC (rev 356)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-09-09 22:43:27 UTC (rev 357)
@@ -1256,9 +1256,6 @@
int nValue = ScreenToValue(m_ptMenu.y);
if(nTick < 0) return false;
- UINT maxpoints = (pSndFile->m_nType == MOD_TYPE_XM) ? 12 : 25;
- //To check: Should there be MAX_ENVPOINTS?
-
nValue = CLAMP(nValue, 0, 64);
INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
@@ -1280,7 +1277,7 @@
return false;
}
- if (envelope->nNodes < maxpoints)
+ if (envelope->nNodes < pSndFile->GetModSpecifications().envelopePointsMax)
{
if (!envelope->nNodes)
{
@@ -1973,8 +1970,6 @@
CModDoc *pModDoc = GetDocument();
if ((pModDoc) && (node>0) && (node <= EnvGetLastPoint()))
{
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
-
INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
if(envelope == nullptr) return;
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-07 20:24:18 UTC (rev 356)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-09 22:43:27 UTC (rev 357)
@@ -216,11 +216,31 @@
return (value > 9) ? 9 : value;
}
+// Convert IT/MPTM envelope data into MPT's internal envelope format - To be used by ITInstrToMPT()
+void ITEnvToMPT(const ITENVELOPE *itEnv, INSTRUMENTENVELOPE *mptEnv, const BYTE envOffset, const int iEnvMax)
+//-----------------------------------------------------------------------------------------------------------
+{
+ mptEnv->nNodes = min(itEnv->num, iEnvMax);
+ mptEnv->nLoopStart = itEnv->lpb;
+ mptEnv->nLoopEnd = itEnv->lpe;
+ mptEnv->nSustainStart = itEnv->slb;
+ mptEnv->nSustainEnd = itEnv->sle;
+ // Attention: Full MPTM envelope is stored in extended instrument properties
+ for (UINT ev = 0; ev < 25; ev++)
+ {
+ mptEnv->Values[ev] = itEnv->data[ev * 3] + envOffset;
+ mptEnv->Ticks[ev] = (itEnv->data[ev * 3 + 2] << 8) | (itEnv->data[ev * 3 + 1]);
+ }
+}
+
//BOOL CSoundFile::ITInstrToMPT(const void *p, MODINSTRUMENT *pIns, UINT trkvers)
long CSoundFile::ITInstrToMPT(const void *p, MODINSTRUMENT *pIns, UINT trkvers) //rewbs.modularInstData
//--------------------------------------------------------------------------------
{
+ // Envelope point count. Limited to 25 in IT format.
+ const int iEnvMax = (m_nType & MOD_TYPE_MPT) ? MAX_ENVPOINTS : 25;
+
long returnVal=0;
pIns->pTuning = m_defaultInstrument.pTuning;
pIns->nPluginVelocityHandling = PLUGIN_VELOCITYHANDLING_CHANNEL;
@@ -257,6 +277,7 @@
}
pIns->VolEnv.Values[ev] = pis->nodes[ev*2+1];
}
+
pIns->nNNA = pis->nna;
pIns->nDCT = pis->dnc;
pIns->nPan = 0x80;
@@ -283,7 +304,7 @@
pIns->nFadeOut = pis->fadeout << 5; // should be 6?
pIns->nGlobalVol = pis->gbv >> 1;
if (pIns->nGlobalVol > 64) pIns->nGlobalVol = 64;
- for (UINT j=0; j<NOTE_MAX; j++)
+ for (UINT j = 0; j < 120; j++)
{
UINT note = pis->keyboard[j*2];
UINT ins = pis->keyboard[j*2+1];
@@ -295,7 +316,7 @@
if (*((int *)pis->dummy) == 'MPTX')
{
const ITINSTRUMENTEX *pisex = (const ITINSTRUMENTEX *)pis;
- for (UINT k=0; k<NOTE_MAX; k++)
+ for (UINT k = 0; k < 120; k++)
{
pIns->Keyboard[k] |= ((UINT)pisex->keyboardhi[k] << 8);
}
@@ -352,45 +373,21 @@
if (pis->volenv.flags & 2) pIns->dwFlags |= ENV_VOLLOOP;
if (pis->volenv.flags & 4) pIns->dwFlags |= ENV_VOLSUSTAIN;
if (pis->volenv.flags & 8) pIns->dwFlags |= ENV_VOLCARRY;
- pIns->VolEnv.nNodes = pis->volenv.num;
- if (pIns->VolEnv.nNodes > 25) pIns->VolEnv.nNodes = 25;
- pIns->VolEnv.nLoopStart = pis->volenv.lpb;
- pIns->VolEnv.nLoopEnd = pis->volenv.lpe;
- pIns->VolEnv.nSustainStart = pis->volenv.slb;
- pIns->VolEnv.nSustainEnd = pis->volenv.sle;
+ ITEnvToMPT(&pis->volenv, &pIns->VolEnv, 0, iEnvMax);
// Panning Envelope
if (pis->panenv.flags & 1) pIns->dwFlags |= ENV_PANNING;
if (pis->panenv.flags & 2) pIns->dwFlags |= ENV_PANLOOP;
if (pis->panenv.flags & 4) pIns->dwFlags |= ENV_PANSUSTAIN;
if (pis->panenv.flags & 8) pIns->dwFlags |= ENV_PANCARRY;
- pIns->PanEnv.nNodes = pis->panenv.num;
- if (pIns->PanEnv.nNodes > 25) pIns->PanEnv.nNodes = 25;
- pIns->PanEnv.nLoopStart = pis->panenv.lpb;
- pIns->PanEnv.nLoopEnd = pis->panenv.lpe;
- pIns->PanEnv.nSustainStart = pis->panenv.slb;
- pIns->PanEnv.nSustainEnd = pis->panenv.sle;
+ ITEnvToMPT(&pis->panenv, &pIns->PanEnv, 32, iEnvMax);
// Pitch Envelope
if (pis->pitchenv.flags & 1) pIns->dwFlags |= ENV_PITCH;
if (pis->pitchenv.flags & 2) pIns->dwFlags |= ENV_PITCHLOOP;
if (pis->pitchenv.flags & 4) pIns->dwFlags |= ENV_PITCHSUSTAIN;
if (pis->pitchenv.flags & 8) pIns->dwFlags |= ENV_PITCHCARRY;
if (pis->pitchenv.flags & 0x80) pIns->dwFlags |= ENV_FILTER;
- pIns->PitchEnv.nNodes = pis->pitchenv.num;
- if (pIns->PitchEnv.nNodes > 25) pIns->PitchEnv.nNodes = 25;
- pIns->PitchEnv.nLoopStart = pis->pitchenv.lpb;
- pIns->PitchEnv.nLoopEnd = pis->pitchenv.lpe;
- pIns->PitchEnv.nSustainStart = pis->pitchenv.slb;
- pIns->PitchEnv.nSustainEnd = pis->pitchenv.sle;
- // Envelopes Data
- for (UINT ev=0; ev<25; ev++)
- {
- pIns->VolEnv.Values[ev] = pis->volenv.data[ev*3];
- pIns->VolEnv.Ticks[ev] = (pis->volenv.data[ev*3+2] << 8) | (pis->volenv.data[ev*3+1]);
- pIns->PanEnv.Values[ev] = pis->panenv.data[ev*3] + 32;
- pIns->PanEnv.Ticks[ev] = (pis->panenv.data[ev*3+2] << 8) | (pis->panenv.data[ev*3+1]);
- pIns->PitchEnv.Values[ev] = pis->pitchenv.data[ev*3] + 32;
- pIns->PitchEnv.Ticks[ev] = (pis->pitchenv.data[ev*3+2] << 8) | (pis->pitchenv.data[ev*3+1]);
- }
+ ITEnvToMPT(&pis->pitchenv, &pIns->PitchEnv, 32, iEnvMax);
+
pIns->nNNA = pis->nna;
pIns->nDCT = pis->dct;
pIns->nDNA = pis->dca;
@@ -407,9 +404,10 @@
if (pIns->nPan > 256) pIns->nPan = 128;
if (pis->dfp < 0x80) pIns->dwFlags |= ENV_SETPANNING;
}
- if ((pIns->VolEnv.nLoopStart >= 25) || (pIns->VolEnv.nLoopEnd >= 25)) pIns->dwFlags &= ~ENV_VOLLOOP;
- if ((pIns->VolEnv.nSustainStart >= 25) || (pIns->VolEnv.nSustainEnd >= 25)) pIns->dwFlags &= ~ENV_VOLSUSTAIN;
+ if ((pIns->VolEnv.nLoopStart >= iEnvMax) || (pIns->VolEnv.nLoopEnd >= iEnvMax)) pIns->dwFlags &= ~ENV_VOLLOOP;
+ if ((pIns->VolEnv.nSustainStart >= iEnvMax) || (pIns->VolEnv.nSustainEnd >= iEnvMax)) pIns->dwFlags &= ~ENV_VOLSUSTAIN;
+
return returnVal; //return offset
}
@@ -3504,7 +3502,20 @@
WriteInstrumentPropertyForAllInstruments('PTTL', sizeof(m_defaultInstrument.wPitchToTempoLock), f, instruments, nInstruments);
WriteInstrumentPropertyForAllInstruments('PVEH', sizeof(m_defaultInstrument.nPluginVelocityHandling), f, instruments, nInstruments);
WriteInstrumentPropertyForAllInstruments('PVOH', sizeof(m_defaultInstrument.nPluginVolumeHandling), f, instruments, nInstruments);
-
+
+ if(m_nType & MOD_TYPE_MPT)
+ {
+ // write full envelope information for MPTM files (more env points)
+ WriteInstrumentPropertyForAllInstruments('VP[.', sizeof(m_defaultInstrument.VolEnv.Ticks ), f, instruments, nInstruments);
+ WriteInstrumentPropertyForAllInstruments('VE[.', sizeof(m_defaultInstrument.VolEnv.Values), f, instruments, nInstruments);
+
+ WriteInstrumentPropertyForAllInstruments('PP[.', sizeof(m_defaultInstrument.PanEnv.Ticks), f, instruments, nInstruments);
+ WriteInstrumentPropertyForAllInstruments('PE[.', sizeof(m_defaultInstrument.PanEnv.Values), f, instruments, nInstruments);
+
+ WriteInstrumentPropertyForAllInstruments('PiP[', sizeof(m_defaultInstrument.PitchEnv.Ticks), f, instruments, nInstruments);
+ WriteInstrumentPropertyForAllInstruments('PiE[', sizeof(m_defaultInstrument.PitchEnv.Values), f, instruments, nInstruments);
+ }
+
return;
}
Modified: trunk/OpenMPT/soundlib/Load_xm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-07 20:24:18 UTC (rev 356)
+++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-09-09 22:43:27 UTC (rev 357)
@@ -51,7 +51,7 @@
DWORD shsize; // size of XMSAMPLESTRUCT
BYTE snum[96];
WORD venv[24];
- WORD pIns[24];
+ WORD penv[24];
BYTE vnum, pnum;
BYTE vsustain, vloops, vloope, psustain, ploops, ploope;
BYTE vtype, ptype;
@@ -354,7 +354,7 @@
for (int i = 0; i < 24; ++i) {
xmsh.venv[i] = LittleEndianW(xmsh.venv[i]);
- xmsh.pIns[i] = LittleEndianW(xmsh.pIns[i]);
+ xmsh.penv[i] = LittleEndianW(xmsh.penv[i]);
}
xmsh.volfade = LittleEndianW(xmsh.volfade);
xmsh.res = LittleEndianW(xmsh.res);
@@ -473,8 +473,8 @@
{
pIns->VolEnv.Ticks[ienv] = (WORD)xmsh.venv[ienv*2];
pIns->VolEnv.Values[ienv] = (BYTE)xmsh.venv[ienv*2+1];
- pIns->PanEnv.Ticks[ienv] = (WORD)xmsh.pIns[ienv*2];
- pIns->PanEnv.Values[ienv] = (BYTE)xmsh.pIns[ienv*2+1];
+ pIns->PanEnv.Ticks[ienv] = (WORD)xmsh.penv[ienv*2];
+ pIns->PanEnv.Values[ienv] = (BYTE)xmsh.penv[ienv*2+1];
if (ienv)
{
if (pIns->VolEnv.Ticks[ienv] < pIns->VolEnv.Ticks[ienv-1])
@@ -871,8 +871,8 @@
{
xmsh.venv[ienv*2] = pIns->VolEnv.Ticks[ienv];
xmsh.venv[ienv*2+1] = pIns->VolEnv.Values[ienv];
- xmsh.pIns[ienv*2] = pIns->PanEnv.Ticks[ienv];
- xmsh.pIns[ienv*2+1] = pIns->PanEnv.Values[ienv];
+ xmsh.penv[ienv*2] = pIns->PanEnv.Ticks[ienv];
+ xmsh.penv[ienv*2+1] = pIns->PanEnv.Values[ienv];
}
if (pIns->dwFlags & ENV_VOLUME) xmsh.vtype |= 1;
if (pIns->dwFlags & ENV_VOLSUSTAIN) xmsh.vtype |= 2;
Modified: trunk/OpenMPT/soundlib/Snd_defs.h
===================================================================
--- trunk/OpenMPT/soundlib/Snd_defs.h 2009-09-07 20:24:18 UTC (rev 356)
+++ trunk/OpenMPT/soundlib/Snd_defs.h 2009-09-09 22:43:27 UTC (rev 357)
@@ -71,7 +71,7 @@
#define MAX_BASECHANNELS 127 // Max pattern channels.
//#endif
// -! BEHAVIOUR_CHANGE#0006
-#define MAX_ENVPOINTS 32
+#define MAX_ENVPOINTS 240
#define MIN_PERIOD 0x0020
#define MAX_PERIOD 0xFFFF
#define MAX_PATTERNNAME 32
Modified: trunk/OpenMPT/soundlib/mod_specifications.h
===================================================================
--- trunk/OpenMPT/soundlib/mod_specifications.h 2009-09-07 20:24:18 UTC (rev 356)
+++ trunk/OpenMPT/soundlib/mod_specifications.h 2009-09-09 22:43:27 UTC (rev 357)
@@ -36,6 +36,7 @@
UINT speedMin;
UINT speedMax;
bool hasComments;
+ int envelopePointsMax;
};
@@ -71,6 +72,7 @@
1, //Min Speed
255, //Max Speed
true, //Has song comments
+ 240, //Envelope point count
};
@@ -101,6 +103,7 @@
1, //Min Speed
31, //Max Speed
false, //No song comments
+ 0, //Envelope point count
};
// MOD with MPT extensions.
@@ -129,6 +132,7 @@
1, //Min Speed
31, //Max Speed
false, //No song comments
+ 0, //Envelope point count
};
const CModSpecifications xm =
@@ -156,6 +160,7 @@
1, //Min Speed
31, //Max Speed
false, //No song comments
+ 12, //Envelope point count
};
// XM with MPT extensions
@@ -184,6 +189,7 @@
1, //Min Speed
31, //Max Speed
true, //Has song comments
+ 12, //Envelope point count
};
const CModSpecifications s3m =
@@ -210,6 +216,7 @@
1, //Min Speed
255, //Max Speed
false, //No song comments
+ 0, //Envelope point count
};
// S3M with MPT extensions
@@ -238,6 +245,7 @@
1, //Min Speed
255, //Max Speed
false, //No song comments
+ 0, //Envelope point count
};
const CModSpecifications it =
@@ -265,6 +273,7 @@
1, //Min Speed
255, //Max Speed
true, //Has song comments
+ 25, //Envelope point count
};
const CModSpecifications itEx =
@@ -292,6 +301,7 @@
1, //Min Speed
255, //Max Speed
true, //Has song comments
+ 25, //Envelope point count
};
} //namespace ModSpecs
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-07 20:24:27
|
Revision: 356
http://modplug.svn.sourceforge.net/modplug/?rev=356&view=rev
Author: saga-games
Date: 2009-09-07 20:24:18 +0000 (Mon, 07 Sep 2009)
Log Message:
-----------
[New] Pattern editor: When shift-clicking somewhere, a selection will be drawn from the previous cursor position to the new position.
[Fix] Mod Saving: The compatibility export was only working properly for 8-bit mono samples. Everything else is going to be downsampled later, so the sample "fixing" has to be done before.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/soundlib/Load_mod.cpp
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-06 19:53:01 UTC (rev 355)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-07 20:24:18 UTC (rev 356)
@@ -1032,32 +1032,40 @@
DragToSel(m_dwEndSel, TRUE);
} else */
{
- m_dwStartSel = GetPositionFromPoint(point);
- if (((m_dwStartSel & 0xFFFF) >> 3) < pModDoc->GetNumChannels())
+ if(CMainFrame::GetInputHandler()->ShiftPressed())
{
- m_dwStatus |= PATSTATUS_MOUSEDRAGSEL;
+ // Shift pressed -> set 2nd selection point
+ DragToSel(GetPositionFromPoint(point), TRUE);
+ } else
+ {
+ // Set first selection point
+ m_dwStartSel = GetPositionFromPoint(point);
+ if (((m_dwStartSel & 0xFFFF) >> 3) < pModDoc->GetNumChannels())
+ {
+ m_dwStatus |= PATSTATUS_MOUSEDRAGSEL;
- if (m_dwStatus & PATSTATUS_CTRLDRAGSEL)
- {
- SetCurSel(m_dwStartSel, m_dwStartSel);
+ if (m_dwStatus & PATSTATUS_CTRLDRAGSEL)
+ {
+ SetCurSel(m_dwStartSel, m_dwStartSel);
+ }
+ if ((CMainFrame::m_dwPatternSetup & PATTERN_DRAGNDROPEDIT)
+ && ((m_dwBeginSel != m_dwEndSel) || (m_dwStatus & PATSTATUS_CTRLDRAGSEL))
+ && ((m_dwStartSel >> 16) >= (m_dwBeginSel >> 16))
+ && ((m_dwStartSel >> 16) <= (m_dwEndSel >> 16))
+ && ((m_dwStartSel & 0xFFFF) >= (m_dwBeginSel & 0xFFFF))
+ && ((m_dwStartSel & 0xFFFF) <= (m_dwEndSel & 0xFFFF)))
+ {
+ m_dwStatus |= PATSTATUS_DRAGNDROPEDIT;
+ } else
+ if (CMainFrame::m_dwPatternSetup & PATTERN_CENTERROW)
+ {
+ SetCurSel(m_dwStartSel, m_dwStartSel);
+ } else
+ {
+ // Fix: Horizontal scrollbar pos screwed when selecting with mouse
+ SetCursorPosition( m_dwStartSel >> 16, m_dwStartSel & 0xFFFF );
+ }
}
- if ((CMainFrame::m_dwPatternSetup & PATTERN_DRAGNDROPEDIT)
- && ((m_dwBeginSel != m_dwEndSel) || (m_dwStatus & PATSTATUS_CTRLDRAGSEL))
- && ((m_dwStartSel >> 16) >= (m_dwBeginSel >> 16))
- && ((m_dwStartSel >> 16) <= (m_dwEndSel >> 16))
- && ((m_dwStartSel & 0xFFFF) >= (m_dwBeginSel & 0xFFFF))
- && ((m_dwStartSel & 0xFFFF) <= (m_dwEndSel & 0xFFFF)))
- {
- m_dwStatus |= PATSTATUS_DRAGNDROPEDIT;
- } else
- if (CMainFrame::m_dwPatternSetup & PATTERN_CENTERROW)
- {
- SetCurSel(m_dwStartSel, m_dwStartSel);
- } else
- {
- // Fix: Horizontal scrollbar pos screwed when selecting with mouse
- SetCursorPosition( m_dwStartSel >> 16, m_dwStartSel & 0xFFFF );
- }
}
}
}
Modified: trunk/OpenMPT/soundlib/Load_mod.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mod.cpp 2009-09-06 19:53:01 UTC (rev 355)
+++ trunk/OpenMPT/soundlib/Load_mod.cpp 2009-09-07 20:24:18 UTC (rev 356)
@@ -546,8 +546,8 @@
MODSAMPLE *pSmp = &Samples[insmap[ismpd]];
if(bCompatibilityExport == true) // first two bytes have to be 0 due to PT's one-shot loop ("no loop")
{
- if(pSmp->nLength > 0) pSmp->pSample[0] = 0;
- if(pSmp->nLength > 1) pSmp->pSample[1] = 0;
+ int iOverwriteLen = 2 * pSmp->GetElementarySampleSize() * ((pSmp->uFlags & CHN_STEREO) ? 2 : 1);
+ memset(pSmp->pSample, 0, min(iOverwriteLen, pSmp->GetSampleSizeInBytes()));
}
UINT flags = RS_PCM8S;
#ifndef NO_PACKING
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-06 19:53:11
|
Revision: 355
http://modplug.svn.sourceforge.net/modplug/?rev=355&view=rev
Author: saga-games
Date: 2009-09-06 19:53:01 +0000 (Sun, 06 Sep 2009)
Log Message:
-----------
[Fix] Pattern editor: Find/Replace works now, also with high instrument numbers. Also, empty instrument numbers won't be affected by "ins+1" anymore
[Imp] Pattern editor: Find/Replace has "Search in whole song" and "Replace all" enabled by default.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/View_pat.h
trunk/OpenMPT/mptrack/dlg_misc.cpp
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2009-09-06 16:09:09 UTC (rev 354)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-09-06 19:53:01 UTC (rev 355)
@@ -1974,7 +1974,6 @@
if ((pModDoc) && (node>0) && (node <= EnvGetLastPoint()))
{
CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
if(envelope == nullptr) return;
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-06 16:09:09 UTC (rev 354)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-06 19:53:01 UTC (rev 355)
@@ -25,8 +25,8 @@
MODCOMMAND CViewPattern::m_cmdOld = {0,0,0,0,0,0};
MODCOMMAND CViewPattern::m_cmdFind = {0,0,0,0,0,0};
MODCOMMAND CViewPattern::m_cmdReplace = {0,0,0,0,0,0};
-DWORD CViewPattern::m_dwFindFlags = 0;
-DWORD CViewPattern::m_dwReplaceFlags = 0;
+DWORD CViewPattern::m_dwFindFlags = PATSEARCH_FULLSEARCH;
+DWORD CViewPattern::m_dwReplaceFlags = PATSEARCH_REPLACEALL;
UINT CViewPattern::m_nFindMinChn = 0;
UINT CViewPattern::m_nFindMaxChn = 0;
signed char cInstrRelChange = 0;
@@ -1901,11 +1901,11 @@
if ((m_dwReplaceFlags & PATSEARCH_INSTR))
{
// Instr--
- if (m_cInstrRelChange == -1)
- if (m->instr > 1) m->instr--;
+ if (m_cInstrRelChange == -1 && m->instr > 1)
+ m->instr--;
// Instr++
- else if (m_cInstrRelChange == 1)
- if (m->instr < MAX_INSTRUMENTS - 1) m->instr++;
+ else if (m_cInstrRelChange == 1 && m->instr > 0 && m->instr < (MAX_INSTRUMENTS - 1))
+ m->instr++;
else m->instr = m_cmdReplace.instr;
}
if ((m_dwReplaceFlags & PATSEARCH_VOLCMD))
Modified: trunk/OpenMPT/mptrack/View_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.h 2009-09-06 16:09:09 UTC (rev 354)
+++ trunk/OpenMPT/mptrack/View_pat.h 2009-09-06 19:53:01 UTC (rev 355)
@@ -76,7 +76,7 @@
static MODCOMMAND m_cmdFind, m_cmdReplace, m_cmdOld;
static DWORD m_dwFindFlags, m_dwReplaceFlags;
static UINT m_nFindMinChn, m_nFindMaxChn;
- signed char m_cInstrRelChange; // relative instrument change (quick'n'dirty fix)
+ signed char m_cInstrRelChange; // relative instrument change (quick'n'dirty fix, this should be implemented in a less cryptic way)
protected:
CFastBitmap m_Dib;
Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-09-06 16:09:09 UTC (rev 354)
+++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-09-06 19:53:01 UTC (rev 355)
@@ -847,6 +847,8 @@
// Instrument
if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO2)) != NULL)
{
+ m_nInstr = 0;
+ cInstrRelChange = 0;
switch(combo->GetItemData(combo->GetCurSel()))
{
case replaceInstrumentMinusOne:
@@ -857,7 +859,6 @@
break;
default:
m_nInstr = combo->GetItemData(combo->GetCurSel());
- cInstrRelChange = 0;
break;
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-06 16:09:20
|
Revision: 354
http://modplug.svn.sourceforge.net/modplug/?rev=354&view=rev
Author: saga-games
Date: 2009-09-06 16:09:09 +0000 (Sun, 06 Sep 2009)
Log Message:
-----------
[Fix] Rearrange Samples: Sample names were copied to the mod title (again...)
[Fix] Treeview: Playing sounds from a soundfont was broken
Modified Paths:
--------------
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Moddoc.h
trunk/OpenMPT/mptrack/Modedit.cpp
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-06 12:45:07 UTC (rev 353)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-09-06 16:09:09 UTC (rev 354)
@@ -2008,6 +2008,7 @@
m_WaveFile.m_nChannels = 4;
m_WaveFile.m_nInstruments = 1;
m_WaveFile.m_nSamples = 1;
+ m_WaveFile.Order.resize(3);
m_WaveFile.Order[0] = 0;
m_WaveFile.Order[1] = 1;
m_WaveFile.Order[2] = m_WaveFile.Order.GetInvalidPatIndex();
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-06 12:45:07 UTC (rev 353)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-06 16:09:09 UTC (rev 354)
@@ -62,7 +62,7 @@
ON_COMMAND(ID_INSTRUMENTS_REMOVEALL,OnRemoveAllInstruments)
// -> CODE#0020
// -> DESC="rearrange sample list"
- ON_COMMAND(ID_REARRANGE_SAMPLES, RearrangeSampleList)
+ ON_COMMAND(ID_REARRANGE_SAMPLES, RearrangeSamples)
// -! NEW_FEATURE#0020
ON_COMMAND(ID_ESTIMATESONGLENGTH, OnEstimateSongLength)
ON_COMMAND(ID_APPROX_BPM, OnApproximateBPM)
@@ -1641,7 +1641,7 @@
::MessageBox(NULL,"Warning: the exported file will not contain any of MPT's file-format hacks.", "Compatibility export warning.",MB_ICONINFORMATION | MB_OK);
break;
default:
- ::MessageBox(NULL,"Compatibility export is currently only available for MOD and IT modules.", "Can't do compatibility export.",MB_ICONINFORMATION | MB_OK);
+ ::MessageBox(NULL,"Compatibility export is currently only available for MOD, XM and IT modules.", "Can't do compatibility export.",MB_ICONINFORMATION | MB_OK);
return;
}
Modified: trunk/OpenMPT/mptrack/Moddoc.h
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.h 2009-09-06 12:45:07 UTC (rev 353)
+++ trunk/OpenMPT/mptrack/Moddoc.h 2009-09-06 16:09:09 UTC (rev 354)
@@ -194,7 +194,7 @@
BOOL RemoveUnusedPlugs();
UINT RemovePlugs(const bool (&keepMask)[MAX_MIXPLUGINS]);
BOOL RemoveUnusedPatterns(BOOL bRemove=TRUE);
- void RearrangeSampleList();
+ void RearrangeSamples();
BOOL CompoCleanup();
PATTERNINDEX InsertPattern(ORDERINDEX nOrd = -1, ROWINDEX nRows = 64);
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-06 12:45:07 UTC (rev 353)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-06 16:09:09 UTC (rev 354)
@@ -1067,8 +1067,8 @@
-void CModDoc::RearrangeSampleList()
-//---------------------------------
+void CModDoc::RearrangeSamples()
+//------------------------------
{
if(m_SndFile.m_nSamples < 2)
return;
@@ -1103,7 +1103,7 @@
// This gotta be moved
m_SndFile.MoveSample(i, nSampleMap[i]);
m_SndFile.Samples[i].pSample = nullptr;
- strcpy(m_SndFile.m_szNames[nSampleMap[i]], m_SndFile.m_szNames[i]);
+ if(nSampleMap[i] > 0) strcpy(m_SndFile.m_szNames[nSampleMap[i]], m_SndFile.m_szNames[i]);
memset(m_SndFile.m_szNames[i], 0, sizeof(m_SndFile.m_szNames[i]));
// Also update instrument mapping (if module is in instrument mode)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-06 12:45:22
|
Revision: 353
http://modplug.svn.sourceforge.net/modplug/?rev=353&view=rev
Author: saga-games
Date: 2009-09-06 12:45:07 +0000 (Sun, 06 Sep 2009)
Log Message:
-----------
[Fix] Playback: Fixed a severe bug that caused a crash when trying to play a module that has an empty order list. (introduced in rev. 338)
[Fix] IT Loader: The fix for old instrument header versions was wrong.
[Fix] Note Properties: When double-clicking on a note in the pattern editor, the noteMin offset was not taken into consideration, which lead to wrong information for some formats.
[Fix] Note Properties: Works partly with PC notes now.
[Imp] Instrument editor: When inserting new envelope points using Shift+Click, the point can now be instantly dragged.
[Imp] Setup: Added note to "always center active row" hint that this is required to be enabled for greyed out patterns
[Imp] XI Saver: Fill out the "created with" field properly (OpenMPT instead of FastTracker 2)
[Ref] Find/Replace: Partly rewrote Ins+/-1 code, does not work yet (didn't work before, either)
[Ref] Renamed Echo Paste to Overflow Paste
Modified Paths:
--------------
trunk/OpenMPT/mptrack/CommandSet.cpp
trunk/OpenMPT/mptrack/CommandSet.h
trunk/OpenMPT/mptrack/Ctrl_ins.cpp
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/Ctrl_pat.h
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/Modedit.cpp
trunk/OpenMPT/mptrack/Moptions.cpp
trunk/OpenMPT/mptrack/View_ins.cpp
trunk/OpenMPT/mptrack/View_ins.h
trunk/OpenMPT/mptrack/View_pat.cpp
trunk/OpenMPT/mptrack/View_pat.h
trunk/OpenMPT/mptrack/dlg_misc.cpp
trunk/OpenMPT/mptrack/dlg_misc.h
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/res/patterns.bmp
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_psm.cpp
trunk/OpenMPT/soundlib/Sampleio.cpp
trunk/OpenMPT/soundlib/Sndmix.cpp
Modified: trunk/OpenMPT/mptrack/CommandSet.cpp
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.cpp 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/CommandSet.cpp 2009-09-06 12:45:07 UTC (rev 353)
@@ -2315,10 +2315,10 @@
commands[kcChannelReset].isDummy = false;
commands[kcChannelReset].Message = "Reset channel";
- commands[kcSwitchEchoPaste].UID = 1787;
- commands[kcSwitchEchoPaste].Message = "Switch echo paste";
- commands[kcSwitchEchoPaste].isHidden = false;
- commands[kcSwitchEchoPaste].isDummy = false;
+ commands[kcSwitchOverflowPaste].UID = 1787;
+ commands[kcSwitchOverflowPaste].Message = "Toggle overflow paste";
+ commands[kcSwitchOverflowPaste].isHidden = false;
+ commands[kcSwitchOverflowPaste].isDummy = false;
commands[kcNotePC].UID = 1788;
commands[kcNotePC].isHidden = false;
Modified: trunk/OpenMPT/mptrack/CommandSet.h
===================================================================
--- trunk/OpenMPT/mptrack/CommandSet.h 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/CommandSet.h 2009-09-06 12:45:07 UTC (rev 353)
@@ -84,7 +84,7 @@
kcEditPaste,
kcEditMixPaste,
kcEditMixPasteITStyle,
- kcSwitchEchoPaste,
+ kcSwitchOverflowPaste,
kcEditSelectAll,
kcEditFind,
kcEditFindNext,
Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2009-09-06 12:45:07 UTC (rev 353)
@@ -314,7 +314,10 @@
}
wsprintf(s, "Map all notes to sample %d", pIns->Keyboard[m_nNote]);
AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_COPY_SMP, s);
- wsprintf(s, "Map all notes to %s", pSndFile->GetNoteName(pIns->NoteMap[m_nNote], m_nInstrument).c_str());
+ if(pIns->NoteMap[m_nNote] < NOTE_MIN_SPECIAL)
+ wsprintf(s, "Map all notes to %s", pSndFile->GetNoteName(pIns->NoteMap[m_nNote], m_nInstrument).c_str());
+ else
+ wsprintf(s, "Map all notes to %s", szSpecialNoteNames[pIns->NoteMap[m_nNote] - NOTE_MIN_SPECIAL]);
AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_COPY_NOTE, s);
AppendMenu(hMenu, MF_STRING, ID_NOTEMAP_RESET, "Reset note mapping");
AppendMenu(hMenu, MF_STRING, ID_INSTRUMENT_DUPLICATE, "Duplicate Instrument\tShift+New");
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2009-09-06 12:45:07 UTC (rev 353)
@@ -52,7 +52,7 @@
ON_COMMAND(ID_PATTERNDETAIL_LO, OnDetailLo)
ON_COMMAND(ID_PATTERNDETAIL_MED, OnDetailMed)
ON_COMMAND(ID_PATTERNDETAIL_HI, OnDetailHi)
- ON_COMMAND(ID_ECHOPASTE, OnToggleEchoPaste)
+ ON_COMMAND(ID_OVERFLOWPASTE, OnToggleOverflowPaste)
ON_CBN_SELCHANGE(IDC_COMBO_INSTRUMENT, OnInstrumentChanged)
// -> CODE#0012
// -> DESC="midi keyboard split"
@@ -158,7 +158,7 @@
m_ToolBar.AddButton(ID_PATTERNDETAIL_MED, 31, TBSTYLE_CHECK, TBSTATE_ENABLED);
m_ToolBar.AddButton(ID_PATTERNDETAIL_HI, 32, TBSTYLE_CHECK, TBSTATE_ENABLED|TBSTATE_CHECKED);
m_ToolBar.AddButton(ID_SEPARATOR, 0, TBSTYLE_SEP);
- m_ToolBar.AddButton(ID_ECHOPASTE, 38, TBSTYLE_CHECK, ((CMainFrame::m_dwPatternSetup & PATTERN_ECHOPASTE) ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED);
+ m_ToolBar.AddButton(ID_OVERFLOWPASTE, 38, TBSTYLE_CHECK, ((CMainFrame::m_dwPatternSetup & PATTERN_OVERFLOWPASTE) ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED);
// Special edit controls -> tab switch to view
m_EditSpacing.SetParent(this);
@@ -297,7 +297,7 @@
// -> CODE#0007
// -> DESC="uncheck follow song checkbox by default"
CheckDlgButton(IDC_PATTERN_FOLLOWSONG, (CMainFrame::m_dwPatternSetup & PATTERN_FOLLOWSONGOFF) ? MF_UNCHECKED : MF_CHECKED);
- m_ToolBar.SetState(ID_ECHOPASTE, ((CMainFrame::m_dwPatternSetup & PATTERN_ECHOPASTE) ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED);
+ m_ToolBar.SetState(ID_OVERFLOWPASTE, ((CMainFrame::m_dwPatternSetup & PATTERN_OVERFLOWPASTE) ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED);
// -! BEHAVIOUR_CHANGE#0007
}
if (dwHintMask & (HINT_MODTYPE|HINT_INSNAMES|HINT_SMPNAMES|HINT_PATNAMES))
@@ -1216,10 +1216,10 @@
SwitchToView();
}
-void CCtrlPatterns::OnToggleEchoPaste()
+void CCtrlPatterns::OnToggleOverflowPaste()
//-------------------------------------
{
- CMainFrame::m_dwPatternSetup ^= PATTERN_ECHOPASTE;
+ CMainFrame::m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE;
UpdateView(HINT_MPTOPTIONS, NULL);
SwitchToView();
}
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-09-06 12:45:07 UTC (rev 353)
@@ -227,7 +227,7 @@
afx_msg void OnUpdateRecord(CCmdUI *pCmdUI);
afx_msg void TogglePluginEditor(); //rewbs.instroVST
afx_msg void ToggleSplitPluginEditor(); //rewbs.instroVST
- afx_msg void OnToggleEchoPaste();
+ afx_msg void OnToggleOverflowPaste();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2009-09-06 12:45:07 UTC (rev 353)
@@ -618,7 +618,7 @@
DWORD d;
// Length / Type
- wsprintf(s, "%d-bit %s, len: %d", (pSmp->uFlags & CHN_16BIT) ? 16 : 8, (pSmp->uFlags & CHN_STEREO) ? "stereo" : "mono", pSmp->nLength);
+ wsprintf(s, "%d-bit %s, len: %d", pSmp->GetElementarySampleSize() * 8, (pSmp->uFlags & CHN_STEREO) ? "stereo" : "mono", pSmp->nLength);
SetDlgItemText(IDC_TEXT5, s);
// Name
memcpy(s, m_pSndFile->m_szNames[m_nSample], 32);
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-09-06 12:45:07 UTC (rev 353)
@@ -207,7 +207,7 @@
#define PATTERN_SYNCMUTE 0x1000000
#define PATTERN_AUTODELAY 0x2000000
#define PATTERN_NOTEFADE 0x4000000
-#define PATTERN_ECHOPASTE 0x8000000
+#define PATTERN_OVERFLOWPASTE 0x8000000
#define PATTERN_POSITIONAWARETIMER 0x10000000
#define PATTERN_RESETCHANNELS 0x20000000
Modified: trunk/OpenMPT/mptrack/Modedit.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-09-06 12:45:07 UTC (rev 353)
@@ -2315,7 +2315,7 @@
nrow++;
//jojo.echopaste
- if(CMainFrame::m_dwPatternSetup & PATTERN_ECHOPASTE)
+ if(CMainFrame::m_dwPatternSetup & PATTERN_OVERFLOWPASTE)
{
while(nrow >= m_SndFile.PatternSize[nPattern])
{
Modified: trunk/OpenMPT/mptrack/Moptions.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/Moptions.cpp 2009-09-06 12:45:07 UTC (rev 353)
@@ -605,7 +605,7 @@
OPTGEN_SYNCMUTE,
OPTGEN_AUTODELAY,
OPTGEN_PATNOTEFADE,
- OPTGEN_ECHOPASTE,
+ OPTGEN_OVERFLOWPASTE,
OPTGEN_POSITIONAWARETIMER,
OPTGEN_RESETCHANNELS,
OPTGEN_MAXOPTIONS
@@ -625,7 +625,7 @@
{"Ignored muted channels", "Notes will not be played on muted channels (unmuting will only start on a new note)."},
{"Quick cursor paste Auto-Repeat", "Leaving the space bar pressed will auto-repeat the action"},
{"No loud samples", "Disable loud playback of samples in the sample/instrument editor"},
- {"Show Prev/Next patterns", "Displays grayed-out version of the previous/next patterns in the pattern editor"},
+ {"Show Prev/Next patterns", "Displays grayed-out version of the previous/next patterns in the pattern editor. Does not work if \"always center active row\" is disabled."},
{"Continuous scroll", "Jumps to the next pattern when moving past the end of a pattern"},
{"Record note off", "Record note off when a key is released on the PC keyboard (Only works in instrument mode)."},
{"Follow song off by default", "Ensure follow song is off when opening or starting a new song."}, //rewbs.noFollow
@@ -644,7 +644,7 @@
{"Maintain sample sync on mute", "Samples continue to be processed when channels are muted (like in IT2 and FT2)"},
{"Automatic delay commands", "Automatically insert appropriate note-delay commands when recording notes during live playback."},
{"Note fade on key up", "Enable to fade/stop notes on key up in pattern tab." },
- {"Echo paste mode", "Wrap pasted pattern data into next pattern. This is useful for creating echo channels."},
+ {"Overflow paste mode", "Wrap pasted pattern data into next pattern. This is useful for creating echo channels."},
{"Position aware timer", "If enabled, timer will show the playback position time if possible instead of running timer."},
{"Reset channels on loop", "If enabled, channels will be reset to their initial state when song looping is enabled.\nNote: This does not affect manual song loops (i.e. triggered by pattern commands)"},
};
@@ -709,7 +709,7 @@
case OPTGEN_AUTODELAY: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_AUTODELAY); break;
case OPTGEN_PATNOTEFADE: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_NOTEFADE); break;
- case OPTGEN_ECHOPASTE: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_ECHOPASTE); break;
+ case OPTGEN_OVERFLOWPASTE: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_OVERFLOWPASTE); break;
case OPTGEN_POSITIONAWARETIMER: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_POSITIONAWARETIMER); break;
case OPTGEN_RESETCHANNELS: bCheck = (CMainFrame::m_dwPatternSetup & PATTERN_RESETCHANNELS); break;
}
@@ -774,13 +774,13 @@
// case OPTGEN_ALTERNTIVEBPMSPEED: mask = PATTERN_ALTERNTIVEBPMSPEED; break;
// rewbs: this options is now available under song settings. It is therefore saved with the song.
// -! NEW_FEATURE#0022
- case OPTGEN_PATTERNCTXMENUSTYLE: mask = PATTERN_OLDCTXMENUSTYLE; break;
- case OPTGEN_SYNCMUTE: mask = PATTERN_SYNCMUTE; break;
- case OPTGEN_AUTODELAY: mask = PATTERN_AUTODELAY; break;
- case OPTGEN_PATNOTEFADE: mask = PATTERN_NOTEFADE; break;
- case OPTGEN_ECHOPASTE: mask = PATTERN_ECHOPASTE; break;
- case OPTGEN_POSITIONAWARETIMER: mask = PATTERN_POSITIONAWARETIMER; break;
- case OPTGEN_RESETCHANNELS: mask = PATTERN_RESETCHANNELS; break;
+ case OPTGEN_PATTERNCTXMENUSTYLE: mask = PATTERN_OLDCTXMENUSTYLE; break;
+ case OPTGEN_SYNCMUTE: mask = PATTERN_SYNCMUTE; break;
+ case OPTGEN_AUTODELAY: mask = PATTERN_AUTODELAY; break;
+ case OPTGEN_PATNOTEFADE: mask = PATTERN_NOTEFADE; break;
+ case OPTGEN_OVERFLOWPASTE: mask = PATTERN_OVERFLOWPASTE; break;
+ case OPTGEN_POSITIONAWARETIMER: mask = PATTERN_POSITIONAWARETIMER; break;
+ case OPTGEN_RESETCHANNELS: mask = PATTERN_RESETCHANNELS; break;
}
if (bCheck) CMainFrame::m_dwPatternSetup |= mask; else CMainFrame::m_dwPatternSetup &= ~mask;
Modified: trunk/OpenMPT/mptrack/View_ins.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.cpp 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-09-06 12:45:07 UTC (rev 353)
@@ -1204,7 +1204,117 @@
return envelope->Ticks[EnvGetReleaseNode()];
}
+bool CViewInstrument::EnvRemovePoint()
+//--------------------------------------
+{
+ CModDoc *pModDoc = GetDocument();
+ if ((pModDoc) && (m_nDragItem) && (m_nDragItem-1 <= EnvGetLastPoint()))
+ {
+ CSoundFile *pSndFile = pModDoc->GetSoundFile();
+ MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
+ if (pIns)
+ {
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr || envelope->nNodes == 0) return false;
+ UINT nPoint = m_nDragItem - 1;
+
+ envelope->nNodes--;
+ for (UINT i=nPoint; i<envelope->nNodes; i++)
+ {
+ envelope->Ticks[i] = envelope->Ticks[i + 1];
+ envelope->Values[i] = envelope->Values[i + 1];
+ }
+ if (nPoint >= envelope->nNodes) nPoint = envelope->nNodes-1;
+ if (envelope->nLoopStart > nPoint) envelope->nLoopStart--;
+ if (envelope->nLoopEnd > nPoint) envelope->nLoopEnd--;
+ if (envelope->nSustainStart > nPoint) envelope->nSustainStart--;
+ if (envelope->nSustainEnd > nPoint) envelope->nSustainEnd--;
+ if (envelope->nReleaseNode>nPoint && envelope->nReleaseNode!=ENV_RELEASE_NODE_UNSET) envelope->nReleaseNode--;
+ envelope->Ticks[0] = 0;
+
+ pModDoc->SetModified();
+ pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL);
+ return true;
+ }
+ }
+ return false;
+}
+
+// Insert point. Returns 0 if error occured, else point ID + 1.
+UINT CViewInstrument::EnvInsertPoint()
+//------------------------------------
+{
+ CModDoc *pModDoc = GetDocument();
+ if (pModDoc)
+ {
+ CSoundFile *pSndFile = pModDoc->GetSoundFile();
+ MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
+ if (pIns)
+ {
+ int nTick = ScreenToTick(m_ptMenu.x);
+ int nValue = ScreenToValue(m_ptMenu.y);
+ if(nTick < 0) return false;
+
+ UINT maxpoints = (pSndFile->m_nType == MOD_TYPE_XM) ? 12 : 25;
+ //To check: Should there be MAX_ENVPOINTS?
+
+ nValue = CLAMP(nValue, 0, 64);
+
+ INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
+ if(envelope == nullptr) return false;
+ BYTE cDefaultValue;
+
+ switch(m_nEnv)
+ {
+ case ENV_VOLUME:
+ cDefaultValue = 64;
+ break;
+ case ENV_PANNING:
+ cDefaultValue = 32;
+ break;
+ case ENV_PITCH:
+ cDefaultValue = (pIns->dwFlags & ENV_FILTER) ? 64 : 32;
+ break;
+ default:
+ return false;
+ }
+
+ if (envelope->nNodes < maxpoints)
+ {
+ if (!envelope->nNodes)
+ {
+ envelope->Ticks[0] = 0;
+ envelope->Values[0] = cDefaultValue;
+ envelope->nNodes = 1;
+ }
+ UINT i = 0;
+ for (i = 0; i < envelope->nNodes; i++) if (nTick <= envelope->Ticks[i]) break;
+ for (UINT j = envelope->nNodes; j > i; j--)
+ {
+ envelope->Ticks[j] = envelope->Ticks[j - 1];
+ envelope->Values[j] = envelope->Values[j - 1];
+ }
+ envelope->Ticks[i] = (WORD)nTick;
+ envelope->Values[i] = (BYTE)nValue;
+ envelope->nNodes++;
+ if (envelope->nLoopStart >= i) envelope->nLoopStart++;
+ if (envelope->nLoopEnd >= i) envelope->nLoopEnd++;
+ if (envelope->nSustainStart >= i) envelope->nSustainStart++;
+ if (envelope->nSustainEnd >= i) envelope->nSustainEnd++;
+ if (envelope->nReleaseNode >= i && envelope->nReleaseNode != ENV_RELEASE_NODE_UNSET) envelope->nReleaseNode++;
+
+ pModDoc->SetModified();
+ pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL);
+ return i + 1;
+ }
+ }
+ }
+ return 0;
+}
+
+
+
void CViewInstrument::DrawPositionMarks(HDC hdc)
//----------------------------------------------
{
@@ -1705,7 +1815,13 @@
if(CMainFrame::GetMainFrame()->GetInputHandler()->ShiftPressed())
{
m_ptMenu = pt;
- OnEnvInsertPoint();
+ m_nDragItem = EnvInsertPoint(); // returns point ID + 1 if successful, else 0.
+ if(m_nDragItem > 0)
+ {
+ // Drag point if successful
+ SetCapture();
+ m_dwStatus |= INSSTATUS_DRAGGING;
+ }
}
}
}
@@ -1939,106 +2055,13 @@
void CViewInstrument::OnEnvRemovePoint()
//--------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if ((pModDoc) && (m_nDragItem) && (m_nDragItem-1 <= EnvGetLastPoint()))
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
- if(envelope == nullptr || envelope->nNodes == 0) return;
-
- UINT nPoint = m_nDragItem - 1;
-
- envelope->nNodes--;
- for (UINT i=nPoint; i<envelope->nNodes; i++)
- {
- envelope->Ticks[i] = envelope->Ticks[i + 1];
- envelope->Values[i] = envelope->Values[i + 1];
- }
- if (nPoint >= envelope->nNodes) nPoint = envelope->nNodes-1;
- if (envelope->nLoopStart > nPoint) envelope->nLoopStart--;
- if (envelope->nLoopEnd > nPoint) envelope->nLoopEnd--;
- if (envelope->nSustainStart > nPoint) envelope->nSustainStart--;
- if (envelope->nSustainEnd > nPoint) envelope->nSustainEnd--;
- if (envelope->nReleaseNode>nPoint && envelope->nReleaseNode!=ENV_RELEASE_NODE_UNSET) envelope->nReleaseNode--;
- envelope->Ticks[0] = 0;
-
- pModDoc->SetModified();
- pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL);
- }
- }
+ EnvRemovePoint();
}
-
void CViewInstrument::OnEnvInsertPoint()
//--------------------------------------
{
- CModDoc *pModDoc = GetDocument();
- if (pModDoc)
- {
- CSoundFile *pSndFile = pModDoc->GetSoundFile();
- MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument];
- if (pIns)
- {
- int nTick = ScreenToTick(m_ptMenu.x);
- int nValue = ScreenToValue(m_ptMenu.y);
- if(nTick < 0) return;
-
- UINT maxpoints = (pSndFile->m_nType == MOD_TYPE_XM) ? 12 : 25;
- //To check: Should there be MAX_ENVPOINTS?
-
- nValue = CLAMP(nValue, 0, 64);
-
- INSTRUMENTENVELOPE *envelope = GetEnvelopePtr();
- if(envelope == nullptr) return;
- BYTE cDefaultValue;
-
- switch(m_nEnv)
- {
- case ENV_VOLUME:
- cDefaultValue = 64;
- break;
- case ENV_PANNING:
- cDefaultValue = 32;
- break;
- case ENV_PITCH:
- cDefaultValue = (pIns->dwFlags & ENV_FILTER) ? 64 : 32;
- break;
- default:
- return;
- }
-
- if (envelope->nNodes < maxpoints)
- {
- if (!envelope->nNodes)
- {
- envelope->Ticks[0] = 0;
- envelope->Values[0] = cDefaultValue;
- envelope->nNodes = 1;
- }
- UINT i = 0;
- for (i = 0; i < envelope->nNodes; i++) if (nTick <= envelope->Ticks[i]) break;
- for (UINT j = envelope->nNodes; j > i; j--)
- {
- envelope->Ticks[j] = envelope->Ticks[j - 1];
- envelope->Values[j] = envelope->Values[j - 1];
- }
- envelope->Ticks[i] = (WORD)nTick;
- envelope->Values[i] = (BYTE)nValue;
- envelope->nNodes++;
- if (envelope->nLoopStart >= i) envelope->nLoopStart++;
- if (envelope->nLoopEnd >= i) envelope->nLoopEnd++;
- if (envelope->nSustainStart >= i) envelope->nSustainStart++;
- if (envelope->nSustainEnd >= i) envelope->nSustainEnd++;
- if (envelope->nReleaseNode >= i && envelope->nReleaseNode != ENV_RELEASE_NODE_UNSET) envelope->nReleaseNode++;
-
- pModDoc->SetModified();
- pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL);
- }
- }
- }
+ EnvInsertPoint();
}
Modified: trunk/OpenMPT/mptrack/View_ins.h
===================================================================
--- trunk/OpenMPT/mptrack/View_ins.h 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/View_ins.h 2009-09-06 12:45:07 UTC (rev 353)
@@ -69,6 +69,8 @@
bool EnvSetPanEnv(bool bEnable);
bool EnvSetPitchEnv(bool bEnable);
bool EnvSetFilterEnv(bool bEnable);
+ UINT EnvInsertPoint();
+ bool EnvRemovePoint();
int TickToScreen(int nTick) const;
int PointToScreen(int nPoint) const;
int ScreenToTick(int x) const;
Modified: trunk/OpenMPT/mptrack/View_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-09-06 12:45:07 UTC (rev 353)
@@ -29,6 +29,7 @@
DWORD CViewPattern::m_dwReplaceFlags = 0;
UINT CViewPattern::m_nFindMinChn = 0;
UINT CViewPattern::m_nFindMaxChn = 0;
+signed char cInstrRelChange = 0;
IMPLEMENT_SERIAL(CViewPattern, CModScrollView, 0)
@@ -1688,6 +1689,7 @@
pageReplace.m_nCommand = m_cmdReplace.command;
pageReplace.m_nParam = m_cmdReplace.param;
pageReplace.m_dwFlags = m_dwReplaceFlags;
+ pageReplace.cInstrRelChange = m_cInstrRelChange;
dlg.AddPage(&pageFind);
dlg.AddPage(&pageReplace);
if (dlg.DoModal() == IDOK)
@@ -1708,6 +1710,7 @@
m_cmdReplace.command = pageReplace.m_nCommand;
m_cmdReplace.param = pageReplace.m_nParam;
m_dwReplaceFlags = pageReplace.m_dwFlags;
+ m_cInstrRelChange = pageReplace.cInstrRelChange;
m_bContinueSearch = FALSE;
OnEditFindNext();
}
@@ -1866,7 +1869,7 @@
if (!(m_dwReplaceFlags & PATSEARCH_REPLACE)) goto EndSearch;
if (!(m_dwReplaceFlags & PATSEARCH_REPLACEALL))
{
- UINT ans = MessageBox("Replace this occurrence ?", "Replace", MB_YESNOCANCEL);
+ UINT ans = MessageBox("Replace this occurrence?", "Replace", MB_YESNOCANCEL);
if (ans == IDYES) bReplace = TRUE; else
if (ans == IDNO) bReplace = FALSE; else goto EndSearch;
}
@@ -1875,22 +1878,22 @@
if ((m_dwReplaceFlags & PATSEARCH_NOTE))
{
// -1 octave
- if (m_cmdReplace.note == CFindReplaceTab::replaceMinusOctave)
+ if (m_cmdReplace.note == CFindReplaceTab::replaceNoteMinusOctave)
{
if (m->note > 12) m->note -= 12;
} else
// +1 octave
- if (m_cmdReplace.note == CFindReplaceTab::replacePlusOctave)
+ if (m_cmdReplace.note == CFindReplaceTab::replaceNotePlusOctave)
{
if (m->note <= NOTE_MAX - 12) m->note += 12;
} else
// Note--
- if (m_cmdReplace.note == CFindReplaceTab::replaceMinusOne)
+ if (m_cmdReplace.note == CFindReplaceTab::replaceNoteMinusOne)
{
if (m->note > 1) m->note--;
} else
// Note++
- if (m_cmdReplace.note == CFindReplaceTab::replacePlusOne)
+ if (m_cmdReplace.note == CFindReplaceTab::replaceNotePlusOne)
{
if (m->note < NOTE_MAX) m->note++;
} else m->note = m_cmdReplace.note;
@@ -1898,15 +1901,12 @@
if ((m_dwReplaceFlags & PATSEARCH_INSTR))
{
// Instr--
- if (m_cmdReplace.instr == CFindReplaceTab::replaceMinusOne)
- {
+ if (m_cInstrRelChange == -1)
if (m->instr > 1) m->instr--;
- } else
// Instr++
- if (m_cmdReplace.instr == CFindReplaceTab::replacePlusOne)
- {
- if (m->instr < MAX_INSTRUMENTS-1) m->instr++;
- } else m->instr = m_cmdReplace.instr;
+ else if (m_cInstrRelChange == 1)
+ if (m->instr < MAX_INSTRUMENTS - 1) m->instr++;
+ else m->instr = m_cmdReplace.instr;
}
if ((m_dwReplaceFlags & PATSEARCH_VOLCMD))
{
@@ -3609,7 +3609,7 @@
case kcChangeLoopStatus: SendCtrlMessage(CTRLMSG_PAT_LOOP, -1); return wParam;
case kcNewPattern: SendCtrlMessage(CTRLMSG_PAT_NEWPATTERN); return wParam;
case kcSwitchToOrderList: OnSwitchToOrderList();
- case kcSwitchEchoPaste: CMainFrame::m_dwPatternSetup ^= PATTERN_ECHOPASTE; return wParam;
+ case kcSwitchOverflowPaste: CMainFrame::m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE; return wParam;
}
//Ranges:
Modified: trunk/OpenMPT/mptrack/View_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/View_pat.h 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/View_pat.h 2009-09-06 12:45:07 UTC (rev 353)
@@ -76,6 +76,7 @@
static MODCOMMAND m_cmdFind, m_cmdReplace, m_cmdOld;
static DWORD m_dwFindFlags, m_dwReplaceFlags;
static UINT m_nFindMinChn, m_nFindMaxChn;
+ signed char m_cInstrRelChange; // relative instrument change (quick'n'dirty fix)
protected:
CFastBitmap m_Dib;
Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-09-06 12:45:07 UTC (rev 353)
@@ -667,10 +667,10 @@
combo->SetItemData(combo->AddString("..."), 0);
if (m_bReplace)
{
- combo->SetItemData(combo->AddString("note-1"), replaceMinusOne);
- combo->SetItemData(combo->AddString("note+1"), replacePlusOne);
- combo->SetItemData(combo->AddString("-1 oct"), replaceMinusOctave);
- combo->SetItemData(combo->AddString("+1 oct"), replacePlusOctave);
+ combo->SetItemData(combo->AddString("note-1"), replaceNoteMinusOne);
+ combo->SetItemData(combo->AddString("note+1"), replaceNotePlusOne);
+ combo->SetItemData(combo->AddString("-1 oct"), replaceNoteMinusOctave);
+ combo->SetItemData(combo->AddString("+1 oct"), replaceNotePlusOctave);
} else
{
combo->SetItemData(combo->AddString("any"), findAny);
@@ -690,8 +690,8 @@
combo->SetItemData(combo->AddString(".."), 0);
if (m_bReplace)
{
- combo->SetItemData(combo->AddString("ins-1"), replaceMinusOne);
- combo->SetItemData(combo->AddString("ins+1"), replacePlusOne);
+ combo->SetItemData(combo->AddString("ins-1"), replaceInstrumentMinusOne);
+ combo->SetItemData(combo->AddString("ins+1"), replaceInstrumentPlusOne);
}
for (UINT n=1; n<MAX_INSTRUMENTS; n++)
{
@@ -705,10 +705,13 @@
combo->SetItemData(combo->AddString(s), n);
}
UINT ncount = combo->GetCount();
- for (UINT i=0; i<ncount; i++) if (m_nInstr == combo->GetItemData(i))
+ for (UINT i=0; i<ncount; i++)
{
- combo->SetCurSel(i);
- break;
+ if (m_nInstr == combo->GetItemData(i) || (cInstrRelChange == -1 && combo->GetItemData(i) == replaceInstrumentMinusOne) || (cInstrRelChange == 1 && combo->GetItemData(i) == replaceInstrumentPlusOne))
+ {
+ combo->SetCurSel(i);
+ break;
+ }
}
}
// Volume Command
@@ -844,7 +847,19 @@
// Instrument
if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO2)) != NULL)
{
- m_nInstr = combo->GetItemData(combo->GetCurSel());
+ switch(combo->GetItemData(combo->GetCurSel()))
+ {
+ case replaceInstrumentMinusOne:
+ cInstrRelChange = -1;
+ break;
+ case replaceInstrumentPlusOne:
+ cInstrRelChange = 1;
+ break;
+ default:
+ m_nInstr = combo->GetItemData(combo->GetCurSel());
+ cInstrRelChange = 0;
+ break;
+ }
}
// Volume Command
if (((combo = (CComboBox *)GetDlgItem(IDC_COMBO3)) != NULL) && (m_pModDoc))
@@ -1230,7 +1245,10 @@
AppendNotesToControlEx(*combo, pSndFile, m_nInstr);
if (m_nNote <= NOTE_MAX)
- combo->SetCurSel(m_nNote);
+ {
+ const MODCOMMAND::NOTE noteStart = (pSndFile != nullptr) ? pSndFile->GetModSpecifications().noteMin : 1;
+ combo->SetCurSel(m_nNote - (noteStart - 1));
+ }
else
{
for(int i = combo->GetCount() - 1; i >= 0; --i)
@@ -1248,21 +1266,31 @@
if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO2)) != NULL)
{
combo->ResetContent();
- combo->SetItemData(combo->AddString("No Instrument"), 0);
- UINT max = pSndFile->m_nInstruments;
- if (!max) max = pSndFile->m_nSamples;
- for (UINT i=1; i<=max; i++)
+
+ if(m_nNote == NOTE_PC || m_nNote == NOTE_PCS)
{
- wsprintf(s, "%02d:", i);
- int k = strlen(s);
- if (pSndFile->m_nInstruments)
+ // control plugin param note
+ combo->SetItemData(combo->AddString("No Effect"), 0);
+ AddPluginNamesToCombobox(*combo, pSndFile->m_MixPlugins, false);
+ } else
+ {
+ // instrument / sample
+ combo->SetItemData(combo->AddString("No Instrument"), 0);
+ UINT max = max(pSndFile->m_nInstruments, pSndFile->m_nSamples); // instrument / sample mode
+ for (UINT i = 1; i <= max; i++)
{
- if (pSndFile->Instruments[i])
- memcpy(s+k, pSndFile->Instruments[i]->name, 32);
- } else
- memcpy(s+k, pSndFile->m_szNames[i], 32);
- s[k+32] = 0;
- combo->SetItemData(combo->AddString(s), i);
+ wsprintf(s, "%02d: ", i);
+ int k = strlen(s);
+ // instrument / sample
+ if (pSndFile->m_nInstruments)
+ {
+ if (pSndFile->Instruments[i])
+ memcpy(s+k, pSndFile->Instruments[i]->name, 32);
+ } else
+ memcpy(s+k, pSndFile->m_szNames[i], 32);
+ s[k+32] = 0;
+ combo->SetItemData(combo->AddString(s), i);
+ }
}
combo->SetCurSel(m_nInstr);
}
@@ -1272,6 +1300,8 @@
void CPageEditNote::OnNoteChanged()
//---------------------------------
{
+ bool bWasParamControl = (m_nNote == NOTE_PC || m_nNote == NOTE_PCS) ? true : false;
+
CComboBox *combo;
if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL)
{
@@ -1294,6 +1324,10 @@
}
}
}
+ bool bIsNowParamControl = (m_nNote == NOTE_PC || m_nNote == NOTE_PCS) ? true : false;
+ if(bWasParamControl != bIsNowParamControl)
+ UpdateDialog();
+
if (m_pParent) m_pParent->UpdateNote(m_nNote, m_nInstr);
}
@@ -1324,7 +1358,7 @@
if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL)
{
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
- if (pSndFile->m_nType == MOD_TYPE_MOD)
+ if (pSndFile->m_nType == MOD_TYPE_MOD || m_bIsParamControl)
{
combo->EnableWindow(FALSE);
return;
@@ -1427,18 +1461,27 @@
pSndFile = m_pModDoc->GetSoundFile();
if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL)
{
- UINT numfx = m_pModDoc->GetNumEffects();
- UINT fxndx = m_pModDoc->GetIndexFromEffect(m_nCommand, m_nParam);
combo->ResetContent();
- combo->SetItemData(combo->AddString(" None"), (DWORD)-1);
- if (!m_nCommand) combo->SetCurSel(0);
- for (UINT i=0; i<numfx; i++)
+ if(m_bIsParamControl)
{
- if (m_pModDoc->GetEffectInfo(i, s, TRUE))
+ // plugin param control note
+ AddPluginParameternamesToCombobox(*combo, pSndFile->m_MixPlugins[m_nPlugin]);
+ combo->SetCurSel(m_nPluginParam);
+ } else
+ {
+ // process as effect
+ UINT numfx = m_pModDoc->GetNumEffects();
+ UINT fxndx = m_pModDoc->GetIndexFromEffect(m_nCommand, m_nParam);
+ combo->SetItemData(combo->AddString(" None"), (DWORD)-1);
+ if (!m_nCommand) combo->SetCurSel(0);
+ for (UINT i=0; i<numfx; i++)
{
- int k = combo->AddString(s);
- combo->SetItemData(k, i);
- if (i == fxndx) combo->SetCurSel(k);
+ if (m_pModDoc->GetEffectInfo(i, s, TRUE))
+ {
+ int k = combo->AddString(s);
+ combo->SetItemData(k, i);
+ if (i == fxndx) combo->SetCurSel(k);
+ }
}
}
}
Modified: trunk/OpenMPT/mptrack/dlg_misc.h
===================================================================
--- trunk/OpenMPT/mptrack/dlg_misc.h 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/dlg_misc.h 2009-09-06 12:45:07 UTC (rev 353)
@@ -133,6 +133,7 @@
public:
UINT m_nNote, m_nInstr, m_nVolCmd, m_nVol, m_nCommand, m_nParam, m_nMinChannel, m_nMaxChannel;
+ signed char cInstrRelChange;
DWORD m_dwFlags;
enum findItem
@@ -143,10 +144,13 @@
enum replaceItem
{
- replaceMinusOctave = NOTE_MIN_SPECIAL - 1,
- replacePlusOctave = NOTE_MIN_SPECIAL - 2,
- replaceMinusOne = NOTE_MIN_SPECIAL - 3,
- replacePlusOne = NOTE_MIN_SPECIAL - 4
+ replaceNotePlusOne = NOTE_MAX + 1,
+ replaceNoteMinusOne = NOTE_MAX + 2,
+ replaceNotePlusOctave = NOTE_MAX + 3,
+ replaceNoteMinusOctave = NOTE_MAX + 4,
+
+ replaceInstrumentPlusOne = MAX_INSTRUMENTS + 1,
+ replaceInstrumentMinusOne = MAX_INSTRUMENTS + 2,
};
// Make sure there's unused notes between NOTE_MAX and NOTE_MIN_SPECIAL.
@@ -235,10 +239,11 @@
{
protected:
UINT m_nVolCmd, m_nVolume;
+ bool m_bIsParamControl;
public:
CPageEditVolume(CModDoc *pModDoc, CEditCommand *parent):CPageEditCommand(pModDoc, parent, IDD_PAGEEDITVOLUME) {}
- void Init(MODCOMMAND &m) { m_nVolCmd = m.volcmd; m_nVolume = m.vol; }
+ void Init(MODCOMMAND &m) { m_nVolCmd = m.volcmd; m_nVolume = m.vol; m_bIsParamControl = (m.note == NOTE_PC || m.note == NOTE_PCS) ? true : false;}
void UpdateDialog();
void UpdateRanges();
@@ -256,7 +261,9 @@
//============================================
{
protected:
- UINT m_nCommand, m_nParam;
+ UINT m_nCommand, m_nParam, m_nPlugin;
+ UINT m_nPluginParam;
+ bool m_bIsParamControl;
// -> CODE#0010
// -> DESC="add extended parameter mechanism to pattern effects"
UINT m_nXParam, m_nMultiplier;
@@ -268,7 +275,7 @@
CPageEditEffect(CModDoc *pModDoc, CEditCommand *parent):CPageEditCommand(pModDoc, parent, IDD_PAGEEDITEFFECT) {}
// -> CODE#0010
// -> DESC="add extended parameter mechanism to pattern effects"
- void Init(MODCOMMAND &m) { m_nCommand = m.command; m_nParam = m.param; m_pModcommand = &m;}
+ void Init(MODCOMMAND &m) { m_nCommand = m.command; m_nParam = m.param; m_pModcommand = &m; m_bIsParamControl = (m.note == NOTE_PC || m.note == NOTE_PCS) ? true : false; m_nPlugin = m.instr; m_nPluginParam = MODCOMMAND::GetValueVolCol(m.volcmd, m.vol);}
void XInit(UINT xparam = 0, UINT multiplier = 1) { m_nXParam = xparam; m_nMultiplier = multiplier; }
// -! NEW_FEATURE#0010
void UpdateDialog();
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2009-09-06 12:45:07 UTC (rev 353)
@@ -2120,7 +2120,7 @@
BEGIN
ID_EDIT_GOTO_MENU "Go to row / channel / pattern / order"
ID_CLEANUP_COMPO "Reset attributes to defaults (useful for creating sample packs)\nCompo Cleanup"
- ID_ECHOPASTE "Toggle echo paste\nToggle echo paste"
+ ID_OVERFLOWPASTE "Toggle overflow paste\nToggle overflow paste"
END
STRINGTABLE
Modified: trunk/OpenMPT/mptrack/res/patterns.bmp
===================================================================
(Binary files differ)
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/mptrack/resource.h 2009-09-06 12:45:07 UTC (rev 353)
@@ -1113,7 +1113,7 @@
#define ID_CLEANUP_COMPO 59221
#define ID_SAMPLE_DRAW 59224
#define ID_SAMPLE_ADDSILENCE 59225
-#define ID_ECHOPASTE 59226
+#define ID_OVERFLOWPASTE 59226
#define ID_NOTEMAP_COPY_NOTE 59227
#define ID_CLEANUP_REARRANGESAMPLES 59228
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-09-06 12:45:07 UTC (rev 353)
@@ -230,7 +230,7 @@
const ITOLDINSTRUMENT *pis = (const ITOLDINSTRUMENT *)p;
memcpy(pIns->name, pis->name, 26);
memcpy(pIns->filename, pis->filename, 12);
- pIns->nFadeOut = pis->fadeout << 7;
+ pIns->nFadeOut = pis->fadeout << 6;
pIns->nGlobalVol = 64;
for (UINT j=0; j<NOTE_MAX; j++)
{
Modified: trunk/OpenMPT/soundlib/Load_psm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-06 12:45:07 UTC (rev 353)
@@ -776,7 +776,10 @@
for(uint32 nCell = 0; nCell < m_nChannels * Patterns[endPattern].GetNumRows(); nCell++)
{
if(row_data->command == CMD_PATTERNBREAK || row_data->command == CMD_POSITIONJUMP)
+ {
lastRow = nCell / m_nChannels;
+ break;
+ }
row_data++;
}
TryWriteEffect(endPattern, lastRow, CMD_POSITIONJUMP, (BYTE)subsongs[i].restartPos, false, CHANNELINDEX_INVALID, false, true);
Modified: trunk/OpenMPT/soundlib/Sampleio.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/soundlib/Sampleio.cpp 2009-09-06 12:45:07 UTC (rev 353)
@@ -1324,7 +1324,7 @@
memcpy(xfh.extxi, "Extended Instrument: ", 21);
memcpy(xfh.name, pIns->name, 22);
xfh.name[22] = 0x1A;
- memcpy(xfh.trkname, "FastTracker v2.00 ", 20);
+ memcpy(xfh.trkname, "Created by OpenMPT ", 20);
xfh.shsize = 0x102;
fwrite(&xfh, 1, sizeof(xfh), f);
// XI Instrument Header
Modified: trunk/OpenMPT/soundlib/Sndmix.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndmix.cpp 2009-09-01 22:08:43 UTC (rev 352)
+++ trunk/OpenMPT/soundlib/Sndmix.cpp 2009-09-06 12:45:07 UTC (rev 353)
@@ -642,16 +642,18 @@
if ((m_nPattern < Patterns.Size()) && (!Patterns[m_nPattern])) m_nPattern = Order.GetIgnoreIndex();
while (m_nPattern >= Patterns.Size())
{
- // End of song ?
+ // End of song?
if ((m_nPattern == Order.GetInvalidPatIndex()) || (m_nCurrentPattern >= Order.size()))
{
if (!m_nRepeatCount) return FALSE;
ORDERINDEX nRestartPosOverride = m_nRestartPos;
- if(!m_nRestartPos && m_nCurrentPattern <= Order.size())
+ if(!m_nRestartPos && m_nCurrentPattern <= Order.size() && m_nCurrentPattern > 0)
{
- // if we're in a subtune and there's no restart position, go to the first order of the subtune
+ /* Subtune detection. Subtunes are separated by "---" order items, so if we're in a
+ subtune and there's no restart position, we go to the first order of the subtune
+ (i.e. the first order after the previous "---" item) */
for(ORDERINDEX iOrd = m_nCurrentPattern - 1; iOrd > 0; iOrd--)
{
if(Order[iOrd] == Order.GetInvalidPatIndex())
@@ -709,7 +711,6 @@
//Handle Repeat position
if (m_nRepeatCount > 0) m_nRepeatCount--;
m_nCurrentPattern = nRestartPosOverride;
- //m_nRow = 0;
m_dwSongFlags &= ~SONG_BREAKTOROW;
//If restart pos points to +++, move along
while (Order[m_nCurrentPattern] == Order.GetIgnoreIndex()) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sag...@us...> - 2009-09-01 22:08:51
|
Revision: 352
http://modplug.svn.sourceforge.net/modplug/?rev=352&view=rev
Author: saga-games
Date: 2009-09-01 22:08:43 +0000 (Tue, 01 Sep 2009)
Log Message:
-----------
[Imp] S3M saver: Orderlist is now as small as possible (multiple of 2 instead of multiple of 16); Using ST3's default UltraClick value
[Imp] PSM loader: "Cosmetic" changes (use default values of first subtune for default speed/tempo/panning/etc., don't touch patterns if only one subtune is present.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Moddoc.cpp
trunk/OpenMPT/mptrack/Mptrack.cpp
trunk/OpenMPT/soundlib/Load_psm.cpp
trunk/OpenMPT/soundlib/Load_s3m.cpp
Modified: trunk/OpenMPT/mptrack/Moddoc.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-01 18:50:33 UTC (rev 351)
+++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-09-01 22:08:43 UTC (rev 352)
@@ -2077,7 +2077,7 @@
#define MOD_TYPE_XMIT (MOD_TYPE_XM|MOD_TYPE_IT)
#define MOD_TYPE_XMITMPT (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)
#define MOD_TYPE_ITMPT (MOD_TYPE_IT|MOD_TYPE_MPT)
-#define MAX_FXINFO 66 //rewbs.smoothVST, increased from 64... I wonder what this will break?
+#define MAX_FXINFO 68 //rewbs.smoothVST, increased from 64... I wonder what this will break?
const MPTEFFECTINFO gFXInfo[MAX_FXINFO] =
@@ -2153,8 +2153,10 @@
{CMD_S3MCMDEX, 0xF0,0x70, 0, MOD_TYPE_ITMPT, "Instr. control"},
// -> CODE#0010
// -> DESC="add extended parameter mechanism to pattern effects"
- {CMD_XPARAM, 0x00,0x00, 0, MOD_TYPE_XMITMPT, "X param"}
+ {CMD_XPARAM, 0x00,0x00, 0, MOD_TYPE_XMITMPT, "X param"},
// -! NEW_FEATURE#0010
+ {CMD_NOTESLIDEUP, 0x00,0x00, 0, 0, "Note Slide Up"}, // .IMF effect
+ {CMD_NOTESLIDEDOWN, 0x00,0x00, 0, 0, "Note Slide Down"}, // .IMF effect
};
Modified: trunk/OpenMPT/mptrack/Mptrack.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-01 18:50:33 UTC (rev 351)
+++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-09-01 22:08:43 UTC (rev 352)
@@ -1689,6 +1689,7 @@
"coda for sample drawing code|"
"http://coda.s3m.us/|"
"Storlek for all the IT compatibility hints and testcases|"
+ "as well as the IMF loader|"
"http://schismtracker.org/|"
"Pel K. Txnder for the scrolling credits control :)|"
"http://tinyurl.com/4yze8|"
Modified: trunk/OpenMPT/soundlib/Load_psm.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-01 18:50:33 UTC (rev 351)
+++ trunk/OpenMPT/soundlib/Load_psm.cpp 2009-09-01 22:08:43 UTC (rev 352)
@@ -283,13 +283,13 @@
case 0x07: // Default Speed
if(dwSettingsOffset - dwChunkPos + 2 > subChunkSize) break;
- m_nDefaultSpeed = subsong.defaultSpeed = lpStream[dwSettingsOffset + 1];
+ subsong.defaultSpeed = lpStream[dwSettingsOffset + 1];
dwSettingsOffset += 2;
break;
case 0x08: // Default Tempo
if(dwSettingsOffset - dwChunkPos + 2 > subChunkSize) break;
- m_nDefaultTempo = subsong.defaultTempo = lpStream[dwSettingsOffset + 1];
+ subsong.defaultTempo = lpStream[dwSettingsOffset + 1];
dwSettingsOffset += 2;
break;
@@ -313,20 +313,17 @@
switch(lpStream[dwSettingsOffset + 3])
{
case 0: // use panning
- ChnSettings[nChn].nPan = subsong.channelPanning[nChn] = lpStream[dwSettingsOffset + 2] ^ 128;
- ChnSettings[nChn].dwFlags &= ~CHN_SURROUND;
+ subsong.channelPanning[nChn] = lpStream[dwSettingsOffset + 2] ^ 128;
subsong.channelSurround[nChn] = false;
break;
case 2: // surround
- ChnSettings[nChn].nPan = subsong.channelPanning[nChn] = 128;
- ChnSettings[nChn].dwFlags |= CHN_SURROUND;
+ subsong.channelPanning[nChn] = 128;
subsong.channelSurround[nChn] = true;
break;
case 4: // center
- ChnSettings[nChn].nPan = subsong.channelPanning[nChn] = 128;
- ChnSettings[nChn].dwFlags &= ~CHN_SURROUND;
+ subsong.channelPanning[nChn] = 128;
subsong.channelSurround[nChn] = false;
break;
@@ -341,10 +338,10 @@
dwSettingsOffset += 4;
break;
- case 0x0E: // Channel volume table (0...255)
+ case 0x0E: // Channel volume table (0...255) - apparently always 255
if(dwSettingsOffset - dwChunkPos + 3 > subChunkSize) break;
if(lpStream[dwSettingsOffset + 1] < MAX_BASECHANNELS)
- ChnSettings[lpStream[dwSettingsOffset + 1]].nVolume = subsong.channelVolume[lpStream[dwSettingsOffset + 1]] = (lpStream[dwSettingsOffset + 2] >> 2) + 1;
+ subsong.channelVolume[lpStream[dwSettingsOffset + 1]] = (lpStream[dwSettingsOffset + 2] >> 2) + 1;
dwSettingsOffset += 3;
break;
@@ -375,20 +372,17 @@
switch(lpStream[dwChunkPos + i])
{
case 0: // use panning
- ChnSettings[nChn].nPan = subsong.channelPanning[nChn] = lpStream[dwChunkPos + i + 1] ^ 128;
- ChnSettings[nChn].dwFlags &= ~CHN_SURROUND;
+ subsong.channelPanning[nChn] = lpStream[dwChunkPos + i + 1] ^ 128;
subsong.channelSurround[nChn] = false;
break;
case 2: // surround
- ChnSettings[nChn].nPan = subsong.channelPanning[nChn] = 128;
- ChnSettings[nChn].dwFlags |= CHN_SURROUND;
+ subsong.channelPanning[nChn] = 128;
subsong.channelSurround[nChn] = true;
break;
case 4: // center
- ChnSettings[nChn].nPan = subsong.channelPanning[nChn] = 128;
- ChnSettings[nChn].dwFlags &= ~CHN_SURROUND;
+ subsong.channelPanning[nChn] = 128;
subsong.channelSurround[nChn] = false;
break;
}
@@ -478,9 +472,23 @@
dwMemPos += chunkSize;
}
- if(m_nChannels == 0)
+ if(m_nChannels == 0 || subsongs.size() == 0)
return false;
+ // Make the default variables of the first subsong global
+ m_nDefaultSpeed = subsongs[0].defaultSpeed;
+ m_nDefaultTempo = subsongs[0].defaultTempo;
+ m_nRestartPos = subsongs[0].restartPos;
+ for(CHANNELINDEX nChn = 0; nChn < m_nChannels; nChn++)
+ {
+ ChnSettings[nChn].nVolume = subsongs[0].channelVolume[nChn];
+ ChnSettings[nChn].nPan = subsongs[0].channelPanning[nChn];
+ if(subsongs[0].channelSurround[nChn])
+ ChnSettings[nChn].dwFlags |= CHN_SURROUND;
+ else
+ ChnSettings[nChn].dwFlags &= ~CHN_SURROUND;
+ }
+
// Now that we know the number of channels, we can go through all the patterns.
// This is a bit stupid since we will even read duplicate patterns twice, but hey, we do this just once... so who cares?
PATTERNINDEX nPat = 0;
@@ -582,7 +590,7 @@
case 0x04: // volslide down
command = CMD_VOLUMESLIDE;
if (bNewFormat) param &= 0x0F;
- else param = (param >> 1) & 0x0F;
+ else if(param < 2) param |= 0xF0; else param = (param >> 1) & 0x0F;
break;
// Portamento
@@ -728,48 +736,51 @@
nPat++;
}
- // write subsong "configuration" to patterns
- for(uint32 i = 0; i < subsongs.size(); i++)
+ if(subsongs.size() > 1)
{
- PATTERNINDEX startPattern = Order[subsongs[i].startOrder], endPattern = Order[subsongs[i].endOrder];
- if(startPattern == PATTERNINDEX_INVALID || endPattern == PATTERNINDEX_INVALID) continue; // what, invalid subtune?
+ // write subsong "configuration" to patterns (only if there are multiple subsongs)
+ for(uint32 i = 0; i < subsongs.size(); i++)
+ {
+ PATTERNINDEX startPattern = Order[subsongs[i].startOrder], endPattern = Order[subsongs[i].endOrder];
+ if(startPattern == PATTERNINDEX_INVALID || endPattern == PATTERNINDEX_INVALID) continue; // what, invalid subtune?
- // set the subsong name to all pattern names
- for(PATTERNINDEX nPat = startPattern; nPat <= endPattern; nPat++)
- {
- SetPatternName(nPat, subsongs[i].songName);
- }
-
- // subsongs with different panning setup -> write to pattern (MUSIC_C.PSM)
- if(bSubsongPanningDiffers)
- {
- for(CHANNELINDEX nChn = 0; nChn < m_nChannels; nChn++)
+ // set the subsong name to all pattern names
+ for(PATTERNINDEX nPat = startPattern; nPat <= endPattern; nPat++)
{
- if(subsongs[i].channelSurround[nChn] == true)
- TryWriteEffect(startPattern, 0, CMD_S3MCMDEX, 0x91, false, nChn, false, true);
- else
- TryWriteEffect(startPattern, 0, CMD_PANNING8, subsongs[i].channelPanning[nChn], false, nChn, false, true);
+ SetPatternName(nPat, subsongs[i].songName);
}
- }
- // write default tempo/speed to pattern
- TryWriteEffect(startPattern, 0, CMD_SPEED, subsongs[i].defaultSpeed, false, CHANNELINDEX_INVALID, false, true);
- TryWriteEffect(startPattern, 0, CMD_TEMPO, subsongs[i].defaultTempo, false, CHANNELINDEX_INVALID, false, true);
- // don't write channel volume for now, as it's always set to 100% anyway
+ // subsongs with different panning setup -> write to pattern (MUSIC_C.PSM)
+ if(bSubsongPanningDiffers)
+ {
+ for(CHANNELINDEX nChn = 0; nChn < m_nChannels; nChn++)
+ {
+ if(subsongs[i].channelSurround[nChn] == true)
+ TryWriteEffect(startPattern, 0, CMD_S3MCMDEX, 0x91, false, nChn, false, true);
+ else
+ TryWriteEffect(startPattern, 0, CMD_PANNING8, subsongs[i].channelPanning[nChn], false, nChn, false, true);
+ }
+ }
+ // write default tempo/speed to pattern
+ TryWriteEffect(startPattern, 0, CMD_SPEED, subsongs[i].defaultSpeed, false, CHANNELINDEX_INVALID, false, true);
+ TryWriteEffect(startPattern, 0, CMD_TEMPO, subsongs[i].defaultTempo, false, CHANNELINDEX_INVALID, false, true);
- // there's a restart pos, so let's try to insert a Bxx command in the last pattern
- if(subsongs[i].restartPos != ORDERINDEX_INVALID)
- {
- ROWINDEX lastRow = Patterns[endPattern].GetNumRows() - 1;
- MODCOMMAND *row_data;
- row_data = Patterns[endPattern];
- for(uint32 nCell = 0; nCell < m_nChannels * Patterns[endPattern].GetNumRows(); nCell++)
+ // don't write channel volume for now, as it's always set to 100% anyway
+
+ // there's a restart pos, so let's try to insert a Bxx command in the last pattern
+ if(subsongs[i].restartPos != ORDERINDEX_INVALID)
{
- if(row_data->command == CMD_PATTERNBREAK || row_data->command == CMD_POSITIONJUMP)
- lastRow = nCell / m_nChannels;
- row_data++;
+ ROWINDEX lastRow = Patterns[endPattern].GetNumRows() - 1;
+ MODCOMMAND *row_data;
+ row_data = Patterns[endPattern];
+ for(uint32 nCell = 0; nCell < m_nChannels * Patterns[endPattern].GetNumRows(); nCell++)
+ {
+ if(row_data->command == CMD_PATTERNBREAK || row_data->command == CMD_POSITIONJUMP)
+ lastRow = nCell / m_nChannels;
+ row_data++;
+ }
+ TryWriteEffect(endPattern, lastRow, CMD_POSITIONJUMP, (BYTE)subsongs[i].restartPos, false, CHANNELINDEX_INVALID, false, true);
}
- TryWriteEffect(endPattern, lastRow, CMD_POSITIONJUMP, (BYTE)subsongs[i].restartPos, false, CHANNELINDEX_INVALID, false, true);
}
}
Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-09-01 18:50:33 UTC (rev 351)
+++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-09-01 22:08:43 UTC (rev 352)
@@ -527,7 +527,6 @@
nbo = 2;
else if (nbo & 1) // number of orders must be even
nbo++;
- nbo = (nbo + 15) & 0xF0; // TODO why does it not work otherwise? nbo should be multiple of 2, not 16!
if(nbo > 0xF0) nbo = 0xF0; // sequence too long
header[0x20] = nbo & 0xFF;
header[0x21] = nbo >> 8;
@@ -560,7 +559,7 @@
header[0x31] = CLAMP(m_nDefaultSpeed, 1, 255);
header[0x32] = CLAMP(m_nDefaultTempo, 32, 255);
header[0x33] = CLAMP(m_nSamplePreAmp, 0x10, 0x7F) | 0x80; // Bit 8 = Stereo
- header[0x34] = 0x10; // 16 Channels for UltraClick removal
+ header[0x34] = 0x08; // 8 Channels for UltraClick removal (default)
header[0x35] = 0xFC; // Write pan positions
for (i=0; i<32; i++)
{
@@ -571,7 +570,7 @@
} else header[0x40+i] = 0xFF;
}
fwrite(header, 0x60, 1, f);
- Order.WriteAsByte(f, nbo);
+ nbo = Order.WriteAsByte(f, nbo);
memset(patptr, 0, sizeof(patptr));
memset(insptr, 0, sizeof(insptr));
UINT ofs0 = 0x60 + nbo;
@@ -595,6 +594,7 @@
{
fwrite(S3MFiller, 0x10 - ((nbi*2+nbp*2) & 0x0F), 1, f);
}
+ fseek(f, ofs1, SEEK_SET);
ofs1 = ftell(f);
fwrite(insex, nbi, 0x50, f);
// Packing patterns
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|