Files
Work/guitar/backup/20040219/TabLines.cpp
2024-08-07 09:16:27 -04:00

80 lines
1.9 KiB
C++

#include <guitar/TabLines.hpp>
#include <guitar/FrettedNote.hpp>
#include <guitar/Fretboard.hpp>
#include <guitar/TabEntry.hpp>
#include <guitar/GlobalDefs.hpp>
// returns -1 on error, 1 if added to entry, 0 otherwise
int TabLines::firstElement(TabEntry &entry,Fretboard &fretboard)
{
TabElement element;
entry.remove();
for(int index=0;index<NumLines;index++)
{
operator[](index).reset();
if(-1==operator[](index).getElement(element[index]))return -1;
}
if(!haveElement(element))return 0;
synchronize();
insert(entry,element,fretboard);
return 1;
}
int TabLines::nextElement(TabEntry &entry,Fretboard &fretboard)
{
TabElement element;
entry.remove();
for(int index=0;index<NumLines;index++)
if(-1==operator[](index).getElement(element[index]))return -1;
if(!haveElement(element))return 0;
synchronize();
insert(entry,element,fretboard);
return 1;
}
void TabLines::synchronize(void)
{
int maxPos;
int index;
for(index=0;index<NumLines;index++)
{
if(!index)maxPos=operator[](0).getPosition();
if(operator[](index).getPosition()>maxPos)maxPos=operator[](index).getPosition();
}
for(index=0;index<NumLines;index++)
{
while(operator[](index).getPosition()!=maxPos)(operator[](index))++;
}
}
void TabLines::insert(TabEntry &entry,TabElement &elements,Fretboard &fretboard)
{
for(int index=0;index<NumLines;index++)
{
Element &element=elements[index];
if(!validate(element))continue;
entry.insert(&FrettedNote(fretboard.getAt((NumLines-1)-index,element.getFret()),(NumLines-1)-index,element.getFret(),element.getAction()));
}
}
bool TabLines::haveElement(TabElement &elements)const
{
for(int index=0;index<NumLines;index++)
{
Element &element=elements[index];
if(Action::None!=element.getAction())return true;
}
return false;
}
bool TabLines::validate(Element &element)const
{
if(Fretboard::isValidFret(element.getFret())&&
Action::None!=element.getAction())return true;
return false;
}