int CInstrumentFDS::Compile(CFamiTrackerDoc *pDoc, CChunk *pChunk, int Index)
{
	CStringA str;

	// Store wave
//	int Table = pCompiler->AddWavetable(m_iSamples);
//	int Table = 0;
//	pChunk->StoreByte(Table);

	// Store modulation table, two entries/byte
	for (int i = 0; i < 16; ++i) {
		char Data = GetModulation(i << 1) | (GetModulation((i << 1) + 1) << 3);
		pChunk->StoreByte(Data);
	}
	
	pChunk->StoreByte(GetModulationDelay());
	pChunk->StoreByte(GetModulationDepth());
	pChunk->StoreWord(GetModulationSpeed());

	// Store sequences
	char Switch = (m_pVolume->GetItemCount() > 0 ? 1 : 0) | (m_pArpeggio->GetItemCount() > 0 ? 2 : 0) | (m_pPitch->GetItemCount() > 0 ? 4 : 0);

	pChunk->StoreByte(Switch);

	// Volume
	if (Switch & 1) {
		str.Format(CCompiler::LABEL_SEQ_FDS, Index * 5 + 0);
		pChunk->StoreReference(str);
	}

	// Arpeggio
	if (Switch & 2) {
		str.Format(CCompiler::LABEL_SEQ_FDS, Index * 5 + 1);
		pChunk->StoreReference(str);
	}
	
	// Pitch
	if (Switch & 4) {
		str.Format(CCompiler::LABEL_SEQ_FDS, Index * 5 + 2);
		pChunk->StoreReference(str);
	}

	int size = FIXED_FDS_INST_SIZE;
	size += (m_pVolume->GetItemCount() > 0 ? 2 : 0);
	size += (m_pArpeggio->GetItemCount() > 0 ? 2 : 0);
	size += (m_pPitch->GetItemCount() > 0 ? 2 : 0);
	return size;
}
Beispiel #2
0
void CInstrumentFDS::SaveFile(CFile *pFile, CFamiTrackerDoc *pDoc)
{
	// Write wave
	for (int i = 0; i < WAVE_SIZE; ++i) {
		char sample = GetSample(i);
		pFile->Write(&sample, 1);
	}

	// Write modulation table
	for (int i = 0; i < MOD_SIZE; ++i) {
		char mod = GetModulation(i);
		pFile->Write(&mod, 1);
	}

	// Modulation parameters
	int data;
	data = GetModulationSpeed();
	pFile->Write(&data, sizeof(int));
	data = GetModulationDepth();
	pFile->Write(&data, sizeof(int));
	data = GetModulationDelay();
	pFile->Write(&data, sizeof(int));

	// Sequences
	StoreInstSequence(pFile, m_pVolume);
	StoreInstSequence(pFile, m_pArpeggio);
	StoreInstSequence(pFile, m_pPitch);
}
void CInstrumentFDS::SaveFile(CInstrumentFile *pFile, const CFamiTrackerDoc *pDoc)
{
	// Write wave
	for (int i = 0; i < WAVE_SIZE; ++i) {
		pFile->WriteChar(GetSample(i));
	}

	// Write modulation table
	for (int i = 0; i < MOD_SIZE; ++i) {
		pFile->WriteChar(GetModulation(i));
	}

	// Modulation parameters
	pFile->WriteInt(GetModulationSpeed());
	pFile->WriteInt(GetModulationDepth());
	pFile->WriteInt(GetModulationDelay());

	// Sequences
	StoreInstSequence(pFile, m_pVolume);
	StoreInstSequence(pFile, m_pArpeggio);
	StoreInstSequence(pFile, m_pPitch);
}
void CInstrumentFDS::Store(CDocumentFile *pDocFile)
{
	// Write wave
	for (int i = 0; i < WAVE_SIZE; ++i) {
		pDocFile->WriteBlockChar(GetSample(i));
	}

	// Write modulation table
	for (int i = 0; i < MOD_SIZE; ++i) {
		pDocFile->WriteBlockChar(GetModulation(i));
	}

	// Modulation parameters
	pDocFile->WriteBlockInt(GetModulationSpeed());
	pDocFile->WriteBlockInt(GetModulationDepth());
	pDocFile->WriteBlockInt(GetModulationDelay());

	// Sequences
	StoreSequence(pDocFile, m_pVolume);
	StoreSequence(pDocFile, m_pArpeggio);
	StoreSequence(pDocFile, m_pPitch);
}