From: <sv...@op...> - 2024-11-01 22:25:52
|
Author: sagamusix Date: Fri Nov 1 23:25:40 2024 New Revision: 22056 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22056 Log: [Imp] Warn when Startrekker AM companion file for synthesized instruments is most likely missing. Modified: trunk/OpenMPT/soundlib/Load_mod.cpp Modified: trunk/OpenMPT/soundlib/Load_mod.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp Fri Nov 1 22:17:31 2024 (r22055) +++ trunk/OpenMPT/soundlib/Load_mod.cpp Fri Nov 1 23:25:40 2024 (r22056) @@ -498,6 +498,7 @@ // Reading patterns Patterns.ResizeArray(numPatterns); + std::bitset<32> referencedSamples; for(PATTERNINDEX pat = 0; pat < numPatterns; pat++) { ModCommand *rowBase = nullptr; @@ -608,6 +609,8 @@ if(m.instr != 0) { lastInstrument[chn] = m.instr; + if(isStartrekker) + referencedSamples.set(m.instr & 0x1F); } } if(hasSpeedOnRow && hasTempoOnRow) @@ -747,7 +750,7 @@ mpt::deterministic_random_device rd; auto prng = mpt::make_prng<mpt::deterministic_fast_engine>(rd); - for(SAMPLEINDEX smp = 1; smp <= m_nInstruments; smp++) + for(SAMPLEINDEX smp = 1; smp <= GetNumInstruments(); smp++) { // For Startrekker AM synthesis, we need instrument envelopes. ModInstrument *ins = AllocateInstrument(smp, smp); @@ -767,6 +770,28 @@ // This extra padding is probably present to have identical block sizes for AM and FM instruments. amData.Skip(120 - sizeof(AMInstrument)); } + + if(!m_nInstruments) + { + uint8 emptySampleReferences = 0; + for(SAMPLEINDEX smp = 1; smp <= 31; smp++) + { + if(referencedSamples[smp] && !Samples[smp].nLength) + { + if(++emptySampleReferences > 1) + { + mpt::ustring filenameHint; + if(file.GetOptionalFileName()) + { + const auto filename = file.GetOptionalFileName()->GetFilename().ToUnicode(); + filenameHint = MPT_UFORMAT(" ({}.nt or {}.as)")(filename, filename); + } + AddToLog(LogWarning, MPT_UFORMAT("This Startrekker AM file is most likely missing its companion file{}. Synthesized instruments will not play.")(filenameHint)); + break; + } + } + } + } } #endif // MPT_EXTERNAL_SAMPLES || MPT_BUILD_FUZZER |