Pattern* Pattern::load_from( XMLNode* node, InstrumentList* instruments ) { Pattern* pattern = new Pattern( node->read_string( "name", NULL, false, false ), node->read_string( "info", "", false, false ), node->read_string( "category", "unknown", false, false ), node->read_int( "size", -1, false, false ) ); // FIXME support legacy xml element pattern_name, should once be removed if ( pattern->get_name().isEmpty() ) { pattern->set_name( node->read_string( "pattern_name", "unknown", false, false ) ); } XMLNode note_list_node = node->firstChildElement( "noteList" ); if ( !note_list_node.isNull() ) { XMLNode note_node = note_list_node.firstChildElement( "note" ); while ( !note_node.isNull() ) { Note* note = Note::load_from( ¬e_node, instruments ); if( note ) { pattern->insert_note( note ); } note_node = note_node.nextSiblingElement( "note" ); } } return pattern; }
Pattern* LocalFileMng::loadPattern( const QString& directory ) { InstrumentList* instrList = Hydrogen::get_instance()->getSong()->get_instrument_list(); Pattern *pPattern = NULL; QString patternInfoFile = directory; QFile check( patternInfoFile ); if (check.exists() == false) { ERRORLOG( QString("Load Pattern: Data file %1 not found." ).arg( patternInfoFile ) ); return NULL; } QDomDocument doc = LocalFileMng::openXmlDocument( patternInfoFile ); QFile file( patternInfoFile ); // root element QDomNode rootNode = doc.firstChildElement( "drumkit_pattern" ); // root element if ( rootNode.isNull() ) { ERRORLOG( "Error reading Pattern: Pattern_drumkit_infonode not found" ); return NULL; } QDomNode patternNode = rootNode.firstChildElement( "pattern" ); QString sName( LocalFileMng::readXmlString( patternNode,"pattern_name", "" ) ); QString sInfo( LocalFileMng::readXmlString( patternNode,"info", "" ) ); QString sCategory( LocalFileMng::readXmlString( patternNode,"category", "" ) ); int nSize = -1; nSize = LocalFileMng::readXmlInt( patternNode, "size",nSize ,false,false ); pPattern = new Pattern( sName, sInfo, sCategory, nSize ); QDomNode pNoteListNode = patternNode.firstChildElement( "noteList" ); if ( ! pNoteListNode.isNull() ) { // new code :) QDomNode noteNode = pNoteListNode.firstChildElement( "note" ); while ( ! noteNode.isNull() ) { Note* pNote = NULL; unsigned nPosition = LocalFileMng::readXmlInt( noteNode, "position", 0 ); float fLeadLag = LocalFileMng::readXmlFloat( noteNode, "leadlag", 0.0 , false , false); float fVelocity = LocalFileMng::readXmlFloat( noteNode, "velocity", 0.8f ); float fPan_L = LocalFileMng::readXmlFloat( noteNode, "pan_L", 0.5 ); float fPan_R = LocalFileMng::readXmlFloat( noteNode, "pan_R", 0.5 ); int nLength = LocalFileMng::readXmlInt( noteNode, "length", -1, true ); float nPitch = LocalFileMng::readXmlFloat( noteNode, "pitch", 0.0, false, false ); QString sKey = LocalFileMng::readXmlString( noteNode, "key", "C0", false, false ); QString nNoteOff = LocalFileMng::readXmlString( noteNode, "note_off", "false", false, false ); int instrId = LocalFileMng::readXmlInt( noteNode, "instrument", 0, true ); Instrument *instrRef = instrList->find( instrId ); if ( !instrRef ) { ERRORLOG( QString( "Instrument with ID: '%1' not found. Note skipped." ).arg( instrId ) ); noteNode = noteNode.nextSiblingElement( "note" ); continue; } //assert( instrRef ); bool noteoff = false; if ( nNoteOff == "true" ) noteoff = true; pNote = new Note( instrRef, nPosition, fVelocity, fPan_L, fPan_R, nLength, nPitch); pNote->set_key_octave( sKey ); pNote->set_lead_lag(fLeadLag); pNote->set_note_off( noteoff ); pPattern->insert_note( pNote ); noteNode = noteNode.nextSiblingElement( "note" ); } } return pPattern; }