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

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 &note)
{
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 &note)
{
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;
}