11.07.2014 Views

Flute acoustics: measurement, modelling and design - School of ...

Flute acoustics: measurement, modelling and design - School of ...

Flute acoustics: measurement, modelling and design - School of ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

288 APPENDIX B. PROGRAM LISTINGS<br />

/* check if validation succeeded */<br />

if (ctxt->valid == 0) {<br />

fprintf(stderr, "XML Error: Failed to validate %s\n",<br />

xml_filename);<br />

return 0;<br />

}<br />

xmlFreeParserCtxt(ctxt);<br />

return 1;<br />

}<br />

int parseWoodwind(xmlDocPtr doc, Woodwind* w) {<br />

xmlNodePtr curnode;<br />

EmbouchureHole embouchureHole = NULL;<br />

Vector upstreamBore, downstreamBore, cells;<br />

double upstreamFlange, flange;<br />

Head head;<br />

/* Retrieve <strong>and</strong> validate root node */<br />

if((curnode = getAndAssertDocRoot(doc)) == NULL)<br />

return 0;<br />

curnode = curnode->children;<br />

while(curnode != NULL) {<br />

if(isXMLElement(curnode, EMBOUCHUREHOLE))<br />

if(!parseEmbouchureHole(doc, curnode, &embouchureHole))<br />

return 0;<br />

if(isXMLElement(curnode, UPSTREAM))<br />

if(!parseUpstream(doc, curnode, &upstreamBore, &upstreamFlange))<br />

return 0;<br />

if(isXMLElement(curnode, DOWNSTREAM))<br />

if(!parseDownstream(doc, curnode, &downstreamBore, &cells, &<br />

flange)) return 0;<br />

curnode = curnode->next;<br />

}<br />

head = createHead(embouchureHole, upstreamBore, upstreamFlange,<br />

downstreamBore);<br />

*w = createWoodwind(head, cells, flange);<br />

return 1;<br />

}<br />

int parseEmbouchureHole(xmlDocPtr doc, xmlNodePtr node, EmbouchureHole<br />

* h) {<br />

double radiusin, radiusout, length, boreRadius;<br />

node = node->children;<br />

while(node != NULL) {<br />

/* Fill Hole data */<br />

if(isXMLElement(node, RADIUSIN))<br />

radiusin = getAndScaleXMLDimensionData(doc, node);<br />

if(isXMLElement(node, RADIUSOUT))<br />

radiusout = getAndScaleXMLDimensionData(doc, node);<br />

if(isXMLElement(node, LENGTH))<br />

length = getAndScaleXMLDimensionData(doc, node);<br />

if(isXMLElement(node, BORERADIUS))<br />

boreRadius = getAndScaleXMLDimensionData(doc, node);<br />

node = node->next;<br />

}<br />

/* Ensure dimensions as expected */<br />

if((radiusin

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!