Example #1
0
File: Echo.cpp Project: kode54/Cog
void Echo::PositionChanged()
{
	m_bufferSize = m_sampleRate * 2u;
	try
	{
		m_delayLine.assign(m_bufferSize * 2, 0);
	} MPT_EXCEPTION_CATCH_OUT_OF_MEMORY(e)
	{
		MPT_EXCEPTION_DELETE_OUT_OF_MEMORY(e);
		m_bufferSize = 0;
	}
	m_writePos = 0;
}
Example #2
0
void Echo::Resume()
//-----------------
{
	m_isResumed = true;
	m_sampleRate = m_SndFile.GetSampleRate();
	m_bufferSize = m_sampleRate * 2u;
	RecalculateEchoParams();
	try
	{
		m_delayLine.assign(m_bufferSize * 2, 0);
	} MPT_EXCEPTION_CATCH_OUT_OF_MEMORY(e)
	{
		MPT_EXCEPTION_DELETE_OUT_OF_MEMORY(e);
		m_bufferSize = 0;
	}
	m_writePos = 0;
}
Example #3
0
static bool StringToEnvelope(const std::string &s, InstrumentEnvelope &env, const CModSpecifications &specs)
//----------------------------------------------------------------------------------------------------------
{
	uint32 susBegin = 0, susEnd = 0, loopBegin = 0, loopEnd = 0, bSus = 0, bLoop = 0, bCarry = 0, nPoints = 0, releaseNode = ENV_RELEASE_NODE_UNSET;
	size_t length = s.size(), pos = strlen(pszEnvHdr);
	if(length <= pos || mpt::CompareNoCaseAscii(s.c_str(), pszEnvHdr, pos - 2))
	{
		return false;
	}
	sscanf(&s[pos], pszEnvFmt, &nPoints, &susBegin, &susEnd, &loopBegin, &loopEnd, &bSus, &bLoop, &bCarry);
	while (pos < length && s[pos] != '\r' && s[pos] != '\n') pos++;

	nPoints = MIN(nPoints, specs.envelopePointsMax);
	if (susEnd >= nPoints) susEnd = 0;
	if (susBegin > susEnd) susBegin = susEnd;
	if (loopEnd >= nPoints) loopEnd = 0;
	if (loopBegin > loopEnd) loopBegin = loopEnd;

	try
	{
		env.resize(nPoints);
	} MPT_EXCEPTION_CATCH_OUT_OF_MEMORY(e)
	{
		MPT_EXCEPTION_DELETE_OUT_OF_MEMORY(e);
		return false;
	}
	env.nSustainStart = susBegin;
	env.nSustainEnd = susEnd;
	env.nLoopStart = loopBegin;
	env.nLoopEnd = loopEnd;
	env.nReleaseNode = releaseNode;
	env.dwFlags.set(ENV_LOOP, bLoop != 0);
	env.dwFlags.set(ENV_SUSTAIN, bSus != 0);
	env.dwFlags.set(ENV_CARRY, bCarry != 0);
	env.dwFlags.set(ENV_ENABLED, nPoints > 0);

	int oldn = 0;
	for(auto &p : env)
	{
		while (pos < length && (s[pos] < '0' || s[pos] > '9')) pos++;
		if (pos >= length) break;
		int n1 = atoi(&s[pos]);
		while (pos < length && s[pos] != ',') pos++;
		while (pos < length && (s[pos] < '0' || s[pos] > '9')) pos++;
		if (pos >= length) break;
		int n2 = atoi(&s[pos]);
		if (n1 < oldn) n1 = oldn + 1;
		Limit(n2, ENVELOPE_MIN, ENVELOPE_MAX);
		p.tick = (uint16)n1;
		p.value = (uint8)n2;
		oldn = n1;
		while (pos < length && s[pos] != '\r' && s[pos] != '\n') pos++;
		if (pos >= length) break;
	}
	env.Sanitize();

	// Read release node information.
	env.nReleaseNode = ENV_RELEASE_NODE_UNSET;
	if(pos < length)
	{
		uint8 r = static_cast<uint8>(atoi(&s[pos]));
		if(r == 0 || r >= nPoints || !specs.hasReleaseNode)
			r = ENV_RELEASE_NODE_UNSET;
		env.nReleaseNode = r;
	}
	return true;
}