Initial
This commit is contained in:
143
guitar/TabEntry.cpp
Normal file
143
guitar/TabEntry.cpp
Normal file
@@ -0,0 +1,143 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user