89 lines
2.3 KiB
C++
89 lines
2.3 KiB
C++
#include <guitar/Fingering.hpp>
|
|
#include <guitar/GlobalDefs.hpp>
|
|
|
|
FrettedNotes Fingering::getFingering(const Scale &scale)
|
|
{
|
|
FrettedNotes frettedNotes;
|
|
FrettedNote frettedNote;
|
|
|
|
frettedNotes.size(scale.size());
|
|
GlobalDefs::outDebug(scale.toString());
|
|
for(int index=0;index<scale.size();index++)
|
|
{
|
|
if(!index)getFirst(frettedNote,((Scale&)scale)[index]);
|
|
else getNext(frettedNote,frettedNotes[index-1],((Scale&)scale)[index]);
|
|
frettedNotes[index]=frettedNote;
|
|
}
|
|
return frettedNotes;
|
|
}
|
|
|
|
bool Fingering::getFirst(FrettedNote &frettedNote,const Note ¬e)
|
|
{
|
|
Note tmpNote;
|
|
bool found;
|
|
|
|
found=false;
|
|
mCurrString=0;
|
|
mCurrFret=0;
|
|
GlobalDefs::outDebug(String("[Fingering::getFirst] Looking for ")+note.toString());
|
|
while(!found)
|
|
{
|
|
tmpNote=mFretboard.getAt(mCurrString,mCurrFret);
|
|
GlobalDefs::outDebug(String("[Fingering::getFirst] Str:")+String().fromInt(mCurrString)+String(" Fret:")+String().fromInt(mCurrFret)+String(" ")+tmpNote.toString());
|
|
if(tmpNote==note)
|
|
{
|
|
frettedNote.setString(mCurrString);
|
|
frettedNote.setFret(mCurrFret);
|
|
frettedNote.setNote(tmpNote);
|
|
mAnchorFret=mCurrFret;
|
|
found=true;
|
|
}
|
|
if(mCurrFret>Fretboard::Frets)
|
|
{
|
|
mCurrString++;
|
|
mCurrFret=0;
|
|
if(mCurrString<0)return false;
|
|
}
|
|
mCurrFret++;
|
|
}
|
|
return found;
|
|
}
|
|
|
|
bool Fingering::getNext(FrettedNote &frettedNote,const FrettedNote &prevFrettedNote,const Note ¬e)
|
|
{
|
|
Note tmpNote;
|
|
bool found;
|
|
|
|
found=false;
|
|
GlobalDefs::outDebug(String("[Fingering::getNext] Looking for ")+note.toString());
|
|
if(mCurrFret<0||mCurrString>5)return false;
|
|
while(!found)
|
|
{
|
|
tmpNote=mFretboard.getAt(mCurrString,mCurrFret);
|
|
GlobalDefs::outDebug(String("[Fingering::getNext] Str:")+String().fromInt(mCurrString)+String(" Fret:")+String().fromInt(mCurrFret)+String(" ")+tmpNote.toString());
|
|
if(tmpNote==note)
|
|
{
|
|
frettedNote.setString(mCurrString);
|
|
frettedNote.setFret(mCurrFret);
|
|
frettedNote.setNote(tmpNote);
|
|
found=true;
|
|
}
|
|
if((mCurrFret-mAnchorFret)+1>mMaxStretchFrets)
|
|
{
|
|
mCurrFret=mAnchorFret-2;
|
|
mCurrString++;
|
|
// mAnchorFret=mCurrFret;
|
|
if(mCurrString>5)return false;
|
|
if(mCurrFret<0)mCurrFret=0;
|
|
}
|
|
if(mCurrFret>Fretboard::Frets)
|
|
{
|
|
mCurrString++;
|
|
mCurrFret=0;
|
|
if(mCurrString>5)return false;
|
|
}
|
|
mCurrFret++;
|
|
}
|
|
return found;
|
|
}
|