bool CInstrumentEditorDPCM::LoadSample(CString FilePath, CString FileName) { CFile SampleFile; if (!SampleFile.Open(FilePath, CFile::modeRead)) { AfxMessageBox(IDS_FILE_OPEN_ERROR); return false; } CDSample *pNewSample = new CDSample(); if (pNewSample != NULL) { strcpy(pNewSample->Name, (char*)FileName.GetString()); int Size = (int)SampleFile.GetLength(); int AddSize = 0; // Clip file if too large Size = min(Size, CDSample::MAX_SIZE); // Make sure size is compatible with DPCM hardware if ((Size & 0xF) != 1) { AddSize = 0x10 - ((Size + 0x0F) & 0x0F); } pNewSample->SampleSize = Size + AddSize; pNewSample->SampleData = new char[Size + AddSize]; SampleFile.Read(pNewSample->SampleData, Size); memset(pNewSample->SampleData + Size, 0xAA, AddSize); if (!InsertSample(pNewSample)) return false; } SampleFile.Close(); BuildSampleList(); return true; }
void CInstrumentEditorDPCM::OnBnClickedImport() { CPCMImport ImportDialog; CDSample *pImported; if (!(pImported = ImportDialog.ShowDialog())) return; InsertSample(pImported); BuildSampleList(); }
// Insert a new instrument assigned to sample nSample or duplicate instrument nDuplicate. // If nSample is invalid, an appropriate sample slot is selected. 0 means "no sample". INSTRUMENTINDEX CModDoc::InsertInstrument(SAMPLEINDEX nSample, INSTRUMENTINDEX nDuplicate) //---------------------------------------------------------------------------------------- { if (m_SndFile.GetModSpecifications().instrumentsMax == 0) return INSTRUMENTINDEX_INVALID; ModInstrument *pDup = nullptr; if ((nDuplicate > 0) && (nDuplicate <= m_SndFile.m_nInstruments)) { pDup = m_SndFile.Instruments[nDuplicate]; } if ((!m_SndFile.GetNumInstruments()) && ((m_SndFile.GetNumSamples() > 1) || (m_SndFile.GetSample(1).pSample))) { if (pDup) return INSTRUMENTINDEX_INVALID; ConfirmAnswer result = Reporting::Confirm("Convert existing samples to instruments first?", true); if (result == cnfCancel) { return INSTRUMENTINDEX_INVALID; } if (result == cnfYes) { if(!ConvertSamplesToInstruments()) { return INSTRUMENTINDEX_INVALID; } } } const INSTRUMENTINDEX newins = m_SndFile.GetNextFreeInstrument(); if(newins == INSTRUMENTINDEX_INVALID) { ErrorBox(IDS_ERR_TOOMANYINS, CMainFrame::GetMainFrame()); return INSTRUMENTINDEX_INVALID; } else if(newins > m_SndFile.GetNumInstruments()) { m_SndFile.m_nInstruments = newins; } // Determine which sample slot to use SAMPLEINDEX newsmp = 0; if (nSample < m_SndFile.GetModSpecifications().samplesMax) { // Use specified slot newsmp = nSample; } else if (!pDup) { newsmp = m_SndFile.GetNextFreeSample(newins); if (newsmp > m_SndFile.GetNumSamples()) { // Add a new sample const SAMPLEINDEX inssmp = InsertSample(); if (inssmp != SAMPLEINDEX_INVALID) newsmp = inssmp; } } CriticalSection cs; ModInstrument *pIns = m_SndFile.AllocateInstrument(newins, newsmp); if(pIns == nullptr) { cs.Leave(); ErrorBox(IDS_ERR_OUTOFMEMORY, CMainFrame::GetMainFrame()); return INSTRUMENTINDEX_INVALID; } InitializeInstrument(pIns); if (pDup) { *pIns = *pDup; } SetModified(); return newins; }