74 lines
1.9 KiB
C++
74 lines
1.9 KiB
C++
#include <stdlib.h>
|
||
#include <midiwrt/instrmnt.hpp>
|
||
|
||
Instruments::Instruments(WORD startOrdinal,WORD endOrdinal)
|
||
{
|
||
loadInstruments(startOrdinal,endOrdinal);
|
||
}
|
||
|
||
Instruments::~Instruments()
|
||
{
|
||
}
|
||
|
||
WORD Instruments::loadInstruments(WORD startOrdinal,WORD endOrdinal)
|
||
{
|
||
String semicolonString(";");
|
||
String nullString("\\0");
|
||
String ordinalString;
|
||
String categoryString;
|
||
String nameString;
|
||
char *lpBuffer;
|
||
BYTE lineFeed;
|
||
|
||
size((endOrdinal-startOrdinal)+1);
|
||
for(short index=startOrdinal,offset=0;index<=endOrdinal;index++,offset++)
|
||
{
|
||
String tempString(index);
|
||
lpBuffer=::strtok(tempString,semicolonString);
|
||
if(!lpBuffer)continue;
|
||
ordinalString=lpBuffer;
|
||
lpBuffer=::strtok(0,semicolonString);
|
||
if(!lpBuffer)continue;
|
||
categoryString=lpBuffer;
|
||
lpBuffer=::strtok(0,nullString);
|
||
if(!lpBuffer)continue;
|
||
nameString=lpBuffer;
|
||
operator[](offset)=PureInstrument(::atoi(ordinalString),categoryString,nameString);
|
||
}
|
||
return (WORD)size();
|
||
}
|
||
|
||
WORD Instruments::getInstruments(PureVector<PureInstrument> &vectoredInstruments)
|
||
{
|
||
vectoredInstruments.size(0);
|
||
if(!size())return FALSE;
|
||
vectoredInstruments.size(size());
|
||
for(int i=0;i<size();i++)vectoredInstruments[i]=operator[](i);
|
||
return vectoredInstruments.size();
|
||
}
|
||
|
||
WORD Instruments::locateInstrument(WORD ordinalValue,PureInstrument &somePureInstrument)
|
||
{
|
||
short itemIndex;
|
||
|
||
if(!binarySearch(ordinalValue,itemIndex))return FALSE;
|
||
somePureInstrument=operator[](itemIndex);
|
||
return TRUE;
|
||
}
|
||
|
||
WORD Instruments::binarySearch(WORD ordinal,short &itemIndex)
|
||
{
|
||
short lowerBound(0);
|
||
short upperBound((short)size()-1);
|
||
short indexItem;
|
||
|
||
do{
|
||
indexItem=(lowerBound+upperBound)/2;
|
||
if(operator[](indexItem).ordinal()<ordinal)lowerBound=indexItem+1;
|
||
else upperBound=indexItem-1;
|
||
}while(operator[](indexItem).ordinal()!=ordinal&&lowerBound<=upperBound);
|
||
itemIndex=indexItem;
|
||
return operator[](indexItem).ordinal()==ordinal;
|
||
}
|
||
|
||
|