Files
Work/winmus/INSTRMNT.CPP
2024-08-07 09:16:27 -04:00

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;
}