75 lines
1.9 KiB
C++
75 lines
1.9 KiB
C++
#include <stdlib.h>
|
|
#include <midiapp/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=tempString;
|
|
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;
|
|
}
|
|
|