34 const QString& sDrumkitPath,
36 QString sDrumkitName = node.
read_string(
"name",
"",
false,
false, bSilent );
37 if ( sDrumkitName.isEmpty() ) {
38 ERRORLOG(
"Drumkit has no name, abort" );
42 std::shared_ptr<Drumkit> pDrumkit = std::make_shared<Drumkit>();
43 pDrumkit->set_path( sDrumkitPath );
44 pDrumkit->set_name( sDrumkitName );
45 pDrumkit->set_author( node.
read_string(
"author",
"undefined author",
47 pDrumkit->set_info( node.
read_string(
"info",
"No information available.",
48 true,
true, bSilent ) );
51 true,
true, bSilent ),
52 pDrumkit->get_author() );
53 pDrumkit->set_license( license );
62 pDrumkit->get_author() );
63 pDrumkit->set_image_license( imageLicense );
76 std::map<QString, int> componentMap;
77 int nNextComponentId = 0;
80 XMLNode instrumentListNode = node.firstChildElement(
"instrumentList" );
81 if ( instrumentListNode.isNull() ) {
82 ERRORLOG(
"'instrumentList' node not found. Unable to load instrument list." );
86 auto pInstrumentList = std::make_shared<InstrumentList>();
87 XMLNode instrumentNode = instrumentListNode.firstChildElement(
"instrument" );
89 while ( !instrumentNode.isNull() ) {
92 ERRORLOG( QString(
"instrument nCount >= %1 (MAX_INSTRUMENTS), stop reading instruments" )
98 &instrumentNode, sDrumkitPath, sDrumkitName, license,
nullptr,
100 if ( pInstrument !=
nullptr ) {
101 auto pInstrumentComponents = pInstrument->get_components();
112 instrumentNode.firstChildElement(
"instrumentComponent" );
113 int nnComponentIdx = 0;
115 while ( ! componentNode.isNull() ) {
116 const QString ssComponentName =
117 componentNode.
read_string(
"name",
"Main",
false,
false );
118 if (
auto search = componentMap.find( ssComponentName );
119 search != componentMap.end() ) {
121 nnComponentId = componentMap[ ssComponentName ];
125 nnComponentId = nNextComponentId;
126 auto pDrumkitComponent = std::make_shared<DrumkitComponent>(
127 nnComponentId, ssComponentName );
128 pDrumkit->addComponent( pDrumkitComponent );
129 componentMap[ ssComponentName ] = nnComponentId;
133 if ( nnComponentIdx < pInstrumentComponents->size() ) {
134 auto pInstrumentComponent =
135 pInstrumentComponents->at( nnComponentIdx );
136 if ( pInstrumentComponent !=
nullptr ) {
137 pInstrumentComponent->set_drumkit_componentID(
141 ERRORLOG( QString(
"Unable to access component [%1] of instrument [%2]" )
142 .arg( nnComponentIdx )
143 .arg( pInstrument->get_name() ) );
147 ERRORLOG( QString(
"Component number [%1] out of bound [0,%2] for instrument [%3]" )
148 .arg( nnComponentIdx )
149 .arg( pInstrumentComponents->size() )
150 .arg( pInstrument->get_name() ) );
154 const QString sSelection = componentNode.
read_string(
155 "sampleSelectionAlgo",
"",
true,
true, bSilent );
156 if ( sSelection.compare(
"VELOCITY" ) == 0 ) {
159 else if ( sSelection.compare(
"ROUND_ROBIN" ) == 0 ) {
162 else if ( sSelection.compare(
"RANDOM" ) == 0 ) {
167 componentNode = componentNode.nextSiblingElement(
"instrumentComponent" );
170 pInstrument->set_sample_selection_alg( selection );
172 pDrumkit->addInstrument( pInstrument );
175 ERRORLOG( QString(
"Unable to load instrument [%1]. The drumkit is corrupted. Skipping instrument" )
179 instrumentNode = instrumentNode.nextSiblingElement(
"instrument" );
183 ERRORLOG(
"Newly created instrument list does not contain any instruments. Aborting." );
192 std::vector<std::shared_ptr<DrumkitComponent>> pComponents;
193 XMLNode componentListNode = pNode->firstChildElement(
"componentList" );
194 if ( ! componentListNode.isNull() ) {
195 XMLNode componentNode = componentListNode.firstChildElement(
"drumkitComponent" );
196 while ( ! componentNode.isNull() ) {
198 &componentNode,
nullptr );
199 if ( pDrumkitComponent !=
nullptr ) {
200 pComponents.push_back(pDrumkitComponent);
203 componentNode = componentNode.nextSiblingElement(
"drumkitComponent" );
207 auto pDrumkitComponent = std::make_shared<DrumkitComponent>( 0,
"Main" );
208 pComponents.push_back(pDrumkitComponent);
211 return std::move( pComponents );
QString read_string(const QString &node, const QString &default_value, bool inexistent_ok=true, bool empty_ok=true, bool bSilent=false)
reads a string stored into a child node