144 lines
3.6 KiB
C++
144 lines
3.6 KiB
C++
#include <guitar/TabEntry.hpp>
|
|
#include <guitar/GlobalDefs.hpp>
|
|
#include <guitar/fretboard.hpp>
|
|
#include <midiseq/midiout.hpp>
|
|
#include <midiseq/ChannelModeMessage.hpp>
|
|
|
|
TabEntry::TabEntry(const TabEntry &entry)
|
|
{
|
|
*this=entry;
|
|
}
|
|
|
|
TabEntry &TabEntry::operator=(const TabEntry &entry)
|
|
{
|
|
remove();
|
|
for(int index=0;index<entry.size();index++)insert(&((TabEntry&)entry)[index]);
|
|
setNoteType(entry.getNoteType());
|
|
setComment(entry.getComment());
|
|
hasSeparator(entry.hasSeparator());
|
|
return *this;
|
|
}
|
|
|
|
bool TabEntry::operator==(const TabEntry &entry)const
|
|
{
|
|
if(size()!=entry.size())return false;
|
|
for(int index=0;index<size();index++)
|
|
{
|
|
if(!(((Block<FrettedNote>&)*this).operator[](index)==((TabEntry&)entry)[index]))return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool TabEntry::play(MIDIOutputDevice &midiDevice,bool useDelay)const
|
|
{
|
|
if(!midiDevice.hasDevice())return false;
|
|
// midiDevice.midiEvent(ChannelModeMessage(ChannelModeMessage::AllNotesOff).getEvent());
|
|
for(int index=0;index<size();index++)
|
|
{
|
|
((TabEntry&)*this).operator[](index).noteOn(midiDevice);
|
|
}
|
|
if(false!=useDelay)delay();
|
|
// midiDevice.midiEvent(ChannelModeMessage(ChannelModeMessage::AllNotesOff).getEvent());
|
|
return true;
|
|
}
|
|
|
|
|
|
void TabEntry::delay(void)const
|
|
{
|
|
int actualDelay=Timing::getDelay(mNoteType);
|
|
::Sleep(actualDelay);
|
|
}
|
|
|
|
bool TabEntry::contains(int string) // is there already an entry for string (ie) two notes on same string
|
|
{
|
|
int entryIndex;
|
|
return contains(string,entryIndex);
|
|
}
|
|
|
|
bool TabEntry::contains(int string,int &entryIndex)
|
|
{
|
|
for(int index=0;index<size();index++)
|
|
{
|
|
FrettedNote &frettedNote=operator[](index);
|
|
if(frettedNote.getString()==string)
|
|
{
|
|
entryIndex=index;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool TabEntry::addFrettedNote(int string,const FrettedNote &frettedNote)
|
|
{
|
|
Fretboard fretboard;
|
|
FrettedNote newNote(fretboard.getAt(string,frettedNote.getFret()),string,frettedNote.getFret(),frettedNote.getAction());
|
|
insert(&newNote);
|
|
return true;
|
|
}
|
|
|
|
bool TabEntry::setFrettedNote(int string,const FrettedNote &frettedNote)
|
|
{
|
|
int entryIndex;
|
|
if(!contains(string,entryIndex))return false;
|
|
operator[](entryIndex).setFret(frettedNote.getFret());
|
|
operator[](entryIndex).setAction(frettedNote.getAction());
|
|
return true;
|
|
}
|
|
|
|
bool TabEntry::remove(int string,int fret)
|
|
{
|
|
int entryIndex;
|
|
if(!contains(string,entryIndex))return false;
|
|
Block<FrettedNote>::remove(entryIndex);
|
|
return true;
|
|
}
|
|
|
|
String TabEntry::toString(void)const
|
|
{
|
|
String str;
|
|
|
|
str+="TABENTRY ";
|
|
for(int index=0;index<size();index++)
|
|
{
|
|
str+=((Block<FrettedNote>&)*this).operator[](index).toString();
|
|
if(index<size()-1)str+=",";
|
|
}
|
|
str+=String(" Timing=")+mNoteType.toString();
|
|
return str;
|
|
}
|
|
|
|
bool TabEntry::fromString(String strText)
|
|
{
|
|
Fretboard fretboard;
|
|
char *ptr=strText.str();
|
|
if(strText.isNull()||!(String("TABENTRY")==strText.betweenString(0,' ')))return false;
|
|
ptr=::strtok(ptr,"[\0");
|
|
ptr=::strtok(0,"[\0");
|
|
while(true)
|
|
{
|
|
FrettedNote frettedNote;
|
|
GlobalDefs::outDebug(ptr);
|
|
String strItem=ptr;
|
|
|
|
frettedNote.setString(strItem.betweenString('=',' ').toInt());
|
|
frettedNote.setFret(strItem.betweenString('=',0).betweenString('=',' ').toInt());
|
|
frettedNote.setNote(fretboard.getAt(frettedNote.getString(),frettedNote.getFret()));
|
|
frettedNote.setAction(Action().fromString(strItem.betweenString('=',0).
|
|
betweenString('=',0).betweenString('=',0).betweenString('=',']')));
|
|
insert(&frettedNote);
|
|
ptr=::strtok(0,"[\0");
|
|
if(!ptr)break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool TabEntry::fromChord(const Music::Chord &chord)
|
|
{
|
|
Fretboard fretboard;
|
|
|
|
remove();
|
|
if(!fretboard.getAt(chord,*this))return false;
|
|
return true;
|
|
}
|