495 lines
17 KiB
C++
495 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
|
||
|
{
|
||
|
|
||
|
|
||
|
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
|
||
|
MixLevels::v1_17RC3, // defaultMixLevels
|
||
|
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
|
||
|
MixLevels::Compatible, // defaultMixLevels
|
||
|
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
|
||
|
MixLevels::CompatibleFT2, // defaultMixLevels
|
||
|
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
|
||
|
MixLevels::CompatibleFT2, // defaultMixLevels
|
||
|
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
|
||
|
MixLevels::Compatible, // defaultMixLevels
|
||
|
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
|
||
|
MixLevels::Compatible, // defaultMixLevels
|
||
|
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
|
||
|
MixLevels::Compatible, // defaultMixLevels
|
||
|
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
|
||
|
MixLevels::Compatible, // defaultMixLevels
|
||
|
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 std::array<const CModSpecifications *, 8> Collection = { &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.empty())
|
||
|
{
|
||
|
return MOD_TYPE_NONE;
|
||
|
} else if(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
|