501 lines
17 KiB
C++
501 lines
17 KiB
C++
/*
|
|
* mod_specifications.cpp
|
|
* ----------------------
|
|
* Purpose: Mod specifications characterise the features of every editable module format in OpenMPT, such as the number of supported channels, samples, effects, etc...
|
|
* Notes : (currently none)
|
|
* Authors: OpenMPT Devs
|
|
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
|
*/
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "mod_specifications.h"
|
|
#include "../common/misc_util.h"
|
|
#include <algorithm>
|
|
|
|
OPENMPT_NAMESPACE_BEGIN
|
|
|
|
namespace ModSpecs
|
|
{
|
|
|
|
|
|
// Force built-in integer operations.
|
|
// C++11 constexpr operations on the enum value_type would also solve this.
|
|
#define SongFlag(x) (FlagSet<SongFlags>::store_type(0) | x)
|
|
|
|
|
|
constexpr CModSpecifications mptm_ =
|
|
{
|
|
/*
|
|
TODO: Proper, less arbitrarily chosen values here.
|
|
NOTE: If changing limits, see whether:
|
|
-savefile format and GUI methods can handle new values(might not be a small task :).
|
|
*/
|
|
MOD_TYPE_MPT, // Internal MODTYPE value
|
|
"mptm", // File extension
|
|
NOTE_MIN, // Minimum note index
|
|
NOTE_MAX, // Maximum note index
|
|
4000, // Pattern max.
|
|
4000, // Order max.
|
|
MAX_SEQUENCES, // Sequences max
|
|
1, // Channel min
|
|
127, // Channel max
|
|
32, // Min tempo
|
|
1000, // Max tempo
|
|
1, // Min Speed
|
|
255, // Max Speed
|
|
1, // Min pattern rows
|
|
1024, // Max pattern rows
|
|
25, // Max mod name length
|
|
25, // Max sample name length
|
|
12, // Max sample filename length
|
|
25, // Max instrument name length
|
|
12, // Max instrument filename length
|
|
0, // Max comment line length
|
|
3999, // SamplesMax
|
|
255, // instrumentMax
|
|
mixLevels1_17RC3, // defaultMixLevels
|
|
SongFlag(SONG_LINEARSLIDES | SONG_EXFILTERRANGE | SONG_ITOLDEFFECTS | SONG_ITCOMPATGXX), // Supported song flags
|
|
200, // Max MIDI mapping directives
|
|
MAX_ENVPOINTS, // Envelope point count
|
|
true, // Has notecut.
|
|
true, // Has noteoff.
|
|
true, // Has notefade.
|
|
true, // Has envelope release node
|
|
true, // Has song comments
|
|
true, // Has "+++" pattern
|
|
true, // Has "---" pattern
|
|
true, // Has restart position (order)
|
|
true, // Supports plugins
|
|
true, // Custom pattern time signatures
|
|
true, // Pattern names
|
|
true, // Has artist name
|
|
true, // Has default resampling
|
|
true, // Fixed point tempo
|
|
" JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#????????", // Supported Effects
|
|
" vpcdabuh??gfe?o", // Supported Volume Column commands
|
|
};
|
|
|
|
|
|
|
|
|
|
constexpr CModSpecifications mod_ =
|
|
{
|
|
MOD_TYPE_MOD, // Internal MODTYPE value
|
|
"mod", // File extension
|
|
25, // Minimum note index
|
|
108, // Maximum note index
|
|
128, // Pattern max.
|
|
128, // Order max.
|
|
1, // Only one order list
|
|
1, // Channel min
|
|
99, // Channel max
|
|
32, // Min tempo
|
|
255, // Max tempo
|
|
1, // Min Speed
|
|
31, // Max Speed
|
|
64, // Min pattern rows
|
|
64, // Max pattern rows
|
|
20, // Max mod name length
|
|
22, // Max sample name length
|
|
0, // Max sample filename length
|
|
0, // Max instrument name length
|
|
0, // Max instrument filename length
|
|
0, // Max comment line length
|
|
31, // SamplesMax
|
|
0, // instrumentMax
|
|
mixLevelsCompatible, // defaultMixLevels
|
|
SongFlag(SONG_PT_MODE | SONG_AMIGALIMITS | SONG_ISAMIGA), // Supported song flags
|
|
0, // Max MIDI mapping directives
|
|
0, // No instrument envelopes
|
|
false, // No notecut.
|
|
false, // No noteoff.
|
|
false, // No notefade.
|
|
false, // No envelope release node
|
|
false, // No song comments
|
|
false, // Doesn't have "+++" pattern
|
|
false, // Doesn't have "---" pattern
|
|
true, // Has restart position (order)
|
|
false, // Doesn't support plugins
|
|
false, // No custom pattern time signatures
|
|
false, // No pattern names
|
|
false, // Doesn't have artist name
|
|
false, // Doesn't have default resampling
|
|
false, // Integer tempo
|
|
" 0123456789ABCD?FF?E???????????????????????", // Supported Effects
|
|
" ???????????????", // Supported Volume Column commands
|
|
};
|
|
|
|
|
|
constexpr CModSpecifications xm_ =
|
|
{
|
|
MOD_TYPE_XM, // Internal MODTYPE value
|
|
"xm", // File extension
|
|
13, // Minimum note index
|
|
108, // Maximum note index
|
|
256, // Pattern max.
|
|
255, // Order max.
|
|
1, // Only one order list
|
|
1, // Channel min
|
|
32, // Channel max
|
|
32, // Min tempo
|
|
1000, // Max tempo
|
|
1, // Min Speed
|
|
31, // Max Speed
|
|
1, // Min pattern rows
|
|
256, // Max pattern rows
|
|
20, // Max mod name length
|
|
22, // Max sample name length
|
|
0, // Max sample filename length
|
|
22, // Max instrument name length
|
|
0, // Max instrument filename length
|
|
0, // Max comment line length
|
|
128 * 16, // SamplesMax (actually 16 per instrument)
|
|
128, // instrumentMax
|
|
mixLevelsCompatibleFT2, // defaultMixLevels
|
|
SongFlag(SONG_LINEARSLIDES), // Supported song flags
|
|
0, // Max MIDI mapping directives
|
|
12, // Envelope point count
|
|
false, // No notecut.
|
|
true, // Has noteoff.
|
|
false, // No notefade.
|
|
false, // No envelope release node
|
|
false, // No song comments
|
|
false, // Doesn't have "+++" pattern
|
|
false, // Doesn't have "---" pattern
|
|
true, // Has restart position (order)
|
|
false, // Doesn't support plugins
|
|
false, // No custom pattern time signatures
|
|
false, // No pattern names
|
|
false, // Doesn't have artist name
|
|
false, // Doesn't have default resampling
|
|
false, // Integer tempo
|
|
" 0123456789ABCDRFFTE???GHK??XPL???????????W", // Supported Effects
|
|
" vpcdabuhlrg????", // Supported Volume Column commands
|
|
};
|
|
|
|
// XM with MPT extensions
|
|
constexpr CModSpecifications xmEx_ =
|
|
{
|
|
MOD_TYPE_XM, // Internal MODTYPE value
|
|
"xm", // File extension
|
|
13, // Minimum note index
|
|
108, // Maximum note index
|
|
256, // Pattern max.
|
|
255, // Order max.
|
|
1, // Only one order list
|
|
1, // Channel min
|
|
127, // Channel max
|
|
32, // Min tempo
|
|
1000, // Max tempo
|
|
1, // Min Speed
|
|
31, // Max Speed
|
|
1, // Min pattern rows
|
|
1024, // Max pattern rows
|
|
20, // Max mod name length
|
|
22, // Max sample name length
|
|
0, // Max sample filename length
|
|
22, // Max instrument name length
|
|
0, // Max instrument filename length
|
|
0, // Max comment line length
|
|
MAX_SAMPLES - 1, // SamplesMax (actually 32 per instrument(256 * 32 = 8192), but limited to MAX_SAMPLES = 4000)
|
|
255, // instrumentMax
|
|
mixLevelsCompatibleFT2, // defaultMixLevels
|
|
SongFlag(SONG_LINEARSLIDES | SONG_EXFILTERRANGE), // Supported song flags
|
|
200, // Max MIDI mapping directives
|
|
12, // Envelope point count
|
|
false, // No notecut.
|
|
true, // Has noteoff.
|
|
false, // No notefade.
|
|
false, // No envelope release node
|
|
true, // Has song comments
|
|
false, // Doesn't have "+++" pattern
|
|
false, // Doesn't have "---" pattern
|
|
true, // Has restart position (order)
|
|
true, // Supports plugins
|
|
false, // No custom pattern time signatures
|
|
true, // Pattern names
|
|
true, // Has artist name
|
|
false, // Doesn't have default resampling
|
|
false, // Integer tempo
|
|
" 0123456789ABCDRFFTE???GHK?YXPLZ\\?#???????W", // Supported Effects
|
|
" vpcdabuhlrg????", // Supported Volume Column commands
|
|
};
|
|
|
|
constexpr CModSpecifications s3m_ =
|
|
{
|
|
MOD_TYPE_S3M, // Internal MODTYPE value
|
|
"s3m", // File extension
|
|
13, // Minimum note index
|
|
108, // Maximum note index
|
|
100, // Pattern max.
|
|
255, // Order max.
|
|
1, // Only one order list
|
|
1, // Channel min
|
|
32, // Channel max
|
|
33, // Min tempo
|
|
255, // Max tempo
|
|
1, // Min Speed
|
|
255, // Max Speed
|
|
64, // Min pattern rows
|
|
64, // Max pattern rows
|
|
27, // Max mod name length
|
|
27, // Max sample name length
|
|
12, // Max sample filename length
|
|
0, // Max instrument name length
|
|
0, // Max instrument filename length
|
|
0, // Max comment line length
|
|
99, // SamplesMax
|
|
0, // instrumentMax
|
|
mixLevelsCompatible, // defaultMixLevels
|
|
SongFlag(SONG_FASTVOLSLIDES | SONG_AMIGALIMITS | SONG_S3MOLDVIBRATO), // Supported song flags
|
|
0, // Max MIDI mapping directives
|
|
0, // No instrument envelopes
|
|
true, // Has notecut.
|
|
false, // No noteoff.
|
|
false, // No notefade.
|
|
false, // No envelope release node
|
|
false, // No song comments
|
|
true, // Has "+++" pattern
|
|
true, // Has "---" pattern
|
|
false, // Doesn't have restart position (order)
|
|
false, // Doesn't support plugins
|
|
false, // No custom pattern time signatures
|
|
false, // No pattern names
|
|
false, // Doesn't have artist name
|
|
false, // Doesn't have default resampling
|
|
false, // Integer tempo
|
|
" JFEGHLKRXODB?CQATI?SMNVW?U??????????????? ", // Supported Effects
|
|
" vp?????????????", // Supported Volume Column commands
|
|
};
|
|
|
|
// S3M with MPT extensions
|
|
constexpr CModSpecifications s3mEx_ =
|
|
{
|
|
MOD_TYPE_S3M, // Internal MODTYPE value
|
|
"s3m", // File extension
|
|
13, // Minimum note index
|
|
108, // Maximum note index
|
|
100, // Pattern max.
|
|
255, // Order max.
|
|
1, // Only one order list
|
|
1, // Channel min
|
|
32, // Channel max
|
|
33, // Min tempo
|
|
255, // Max tempo
|
|
1, // Min Speed
|
|
255, // Max Speed
|
|
64, // Min pattern rows
|
|
64, // Max pattern rows
|
|
27, // Max mod name length
|
|
27, // Max sample name length
|
|
12, // Max sample filename length
|
|
0, // Max instrument name length
|
|
0, // Max instrument filename length
|
|
0, // Max comment line length
|
|
99, // SamplesMax
|
|
0, // instrumentMax
|
|
mixLevelsCompatible, // defaultMixLevels
|
|
SongFlag(SONG_FASTVOLSLIDES | SONG_AMIGALIMITS), // Supported song flags
|
|
0, // Max MIDI mapping directives
|
|
0, // No instrument envelopes
|
|
true, // Has notecut.
|
|
false, // No noteoff.
|
|
false, // No notefade.
|
|
false, // No envelope release node
|
|
false, // No song comments
|
|
true, // Has "+++" pattern
|
|
true, // Has "---" pattern
|
|
false, // Doesn't have restart position (order)
|
|
false, // Doesn't support plugins
|
|
false, // No custom pattern time signatures
|
|
false, // No pattern names
|
|
false, // Doesn't have artist name
|
|
false, // Doesn't have default resampling
|
|
false, // Integer tempo
|
|
" JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z?????????? ", // Supported Effects
|
|
" vp?????????????", // Supported Volume Column commands
|
|
};
|
|
|
|
constexpr CModSpecifications it_ =
|
|
{
|
|
MOD_TYPE_IT, // Internal MODTYPE value
|
|
"it", // File extension
|
|
1, // Minimum note index
|
|
120, // Maximum note index
|
|
200, // Pattern max.
|
|
256, // Order max.
|
|
1, // Only one order list
|
|
1, // Channel min
|
|
64, // Channel max
|
|
32, // Min tempo
|
|
255, // Max tempo
|
|
1, // Min Speed
|
|
255, // Max Speed
|
|
1, // Min pattern rows
|
|
200, // Max pattern rows
|
|
25, // Max mod name length
|
|
25, // Max sample name length
|
|
12, // Max sample filename length
|
|
25, // Max instrument name length
|
|
12, // Max instrument filename length
|
|
75, // Max comment line length
|
|
99, // SamplesMax
|
|
99, // instrumentMax
|
|
mixLevelsCompatible, // defaultMixLevels
|
|
SongFlag(SONG_LINEARSLIDES | SONG_ITOLDEFFECTS | SONG_ITCOMPATGXX), // Supported song flags
|
|
0, // Max MIDI mapping directives
|
|
25, // Envelope point count
|
|
true, // Has notecut.
|
|
true, // Has noteoff.
|
|
true, // Has notefade.
|
|
false, // No envelope release node
|
|
true, // Has song comments
|
|
true, // Has "+++" pattern
|
|
true, // Has "--" pattern
|
|
false, // Doesn't have restart position (order)
|
|
false, // Doesn't support plugins
|
|
false, // No custom pattern time signatures
|
|
false, // No pattern names
|
|
false, // Doesn't have artist name
|
|
false, // Doesn't have default resampling
|
|
false, // Integer tempo
|
|
" JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z?????????? ", // Supported Effects
|
|
" vpcdab?h??gfe??", // Supported Volume Column commands
|
|
};
|
|
|
|
constexpr CModSpecifications itEx_ =
|
|
{
|
|
MOD_TYPE_IT, // Internal MODTYPE value
|
|
"it", // File extension
|
|
1, // Minimum note index
|
|
120, // Maximum note index
|
|
240, // Pattern max.
|
|
256, // Order max.
|
|
1, // Only one order list
|
|
1, // Channel min
|
|
127, // Channel max
|
|
32, // Min tempo
|
|
512, // Max tempo
|
|
1, // Min Speed
|
|
255, // Max Speed
|
|
1, // Min pattern rows
|
|
1024, // Max pattern rows
|
|
25, // Max mod name length
|
|
25, // Max sample name length
|
|
12, // Max sample filename length
|
|
25, // Max instrument name length
|
|
12, // Max instrument filename length
|
|
75, // Max comment line length
|
|
3999, // SamplesMax
|
|
255, // instrumentMax
|
|
mixLevelsCompatible, // defaultMixLevels
|
|
SongFlag(SONG_LINEARSLIDES | SONG_EXFILTERRANGE | SONG_ITOLDEFFECTS | SONG_ITCOMPATGXX), // Supported song flags
|
|
200, // Max MIDI mapping directives
|
|
25, // Envelope point count
|
|
true, // Has notecut.
|
|
true, // Has noteoff.
|
|
true, // Has notefade.
|
|
false, // No envelope release node
|
|
true, // Has song comments
|
|
true, // Has "+++" pattern
|
|
true, // Has "---" pattern
|
|
false, // Doesn't have restart position (order)
|
|
true, // Supports plugins
|
|
false, // No custom pattern time signatures
|
|
true, // Pattern names
|
|
true, // Has artist name
|
|
false, // Doesn't have default resampling
|
|
false, // Integer tempo
|
|
" JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\?#??????? ", // Supported Effects
|
|
" vpcdab?h??gfe??", // Supported Volume Column commands
|
|
};
|
|
|
|
const CModSpecifications *Collection[8] = { &mptm_, &mod_, &s3m_, &s3mEx_, &xm_, &xmEx_, &it_, &itEx_ };
|
|
|
|
const CModSpecifications & mptm = mptm_;
|
|
const CModSpecifications & mod = mod_;
|
|
const CModSpecifications & s3m = s3m_;
|
|
const CModSpecifications & s3mEx = s3mEx_;
|
|
const CModSpecifications & xm = xm_;
|
|
const CModSpecifications & xmEx = xmEx_;
|
|
const CModSpecifications & it = it_;
|
|
const CModSpecifications & itEx = itEx_;
|
|
|
|
} // namespace ModSpecs
|
|
|
|
|
|
MODTYPE CModSpecifications::ExtensionToType(std::string ext)
|
|
{
|
|
if(ext == "")
|
|
{
|
|
return MOD_TYPE_NONE;
|
|
}
|
|
if(ext.length() > 0 && ext[0] == '.')
|
|
{
|
|
ext.erase(0, 1);
|
|
}
|
|
ext = mpt::ToLowerCaseAscii(ext);
|
|
for(const auto &spec : ModSpecs::Collection)
|
|
{
|
|
if(ext == spec->fileExtension)
|
|
{
|
|
return spec->internalType;
|
|
}
|
|
}
|
|
return MOD_TYPE_NONE;
|
|
}
|
|
|
|
|
|
bool CModSpecifications::HasNote(ModCommand::NOTE note) const
|
|
{
|
|
if(note >= noteMin && note <= noteMax)
|
|
return true;
|
|
else if(ModCommand::IsSpecialNote(note))
|
|
{
|
|
if(note == NOTE_NOTECUT)
|
|
return hasNoteCut;
|
|
else if(note == NOTE_KEYOFF)
|
|
return hasNoteOff;
|
|
else if(note == NOTE_FADE)
|
|
return hasNoteFade;
|
|
else
|
|
return (internalType == MOD_TYPE_MPT);
|
|
} else if(note == NOTE_NONE)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
|
|
bool CModSpecifications::HasVolCommand(ModCommand::VOLCMD volcmd) const
|
|
{
|
|
if(volcmd >= MAX_VOLCMDS) return false;
|
|
if(volcommands[volcmd] == '?') return false;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool CModSpecifications::HasCommand(ModCommand::COMMAND cmd) const
|
|
{
|
|
if(cmd >= MAX_EFFECTS) return false;
|
|
if(commands[cmd] == '?') return false;
|
|
return true;
|
|
}
|
|
|
|
|
|
char CModSpecifications::GetVolEffectLetter(ModCommand::VOLCMD volcmd) const
|
|
{
|
|
if(volcmd >= MAX_VOLCMDS) return '?';
|
|
return volcommands[volcmd];
|
|
}
|
|
|
|
|
|
char CModSpecifications::GetEffectLetter(ModCommand::COMMAND cmd) const
|
|
{
|
|
if(cmd >= MAX_EFFECTS) return '?';
|
|
return commands[cmd];
|
|
}
|
|
|
|
|
|
OPENMPT_NAMESPACE_END
|