80 lines
1.9 KiB
C++
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;
|
|
}
|